欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

springboot如何通過注解實現(xiàn)多線程

 更新時間:2024年12月12日 15:54:03   作者:aiyongbo123456  
在Spring Boot中實現(xiàn)異步方法時,如果直接在調(diào)用類中使用`@Async`注解,可能會導(dǎo)致異步失敗,正確的做法是將實現(xiàn)異步的方法放在一個獨立的類中,并通過Spring生成的bean來調(diào)用這個方法,這樣可以成功實現(xiàn)異步

springboot通過注解實現(xiàn)多線程

1、springboot啟動類中添加 @EnableAsync

package com.zr.gktjweb;


import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.scheduling.annotation.EnableAsync;

@SpringBootApplication
@EnableAsync
public class GktjwebApplication {

    public static void main(String[] args) {

        SpringApplication.run(GktjwebApplication.class, args);
    }

}

2、在調(diào)用類之外的另一個類方法中添加

package com.zr.gktjweb.aspect;

import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Component;

//@Component
public class AsyThread {
//    @Override
    @Async
    public void run() {
        System.out.println("---------異步線程---------"+Thread.currentThread().getName());
    }
}

3、在另一個類中調(diào)用此方法

package com.zr.gktjweb.controller.login;

import com.zr.gktjweb.aspect.AsyThread;
import com.zr.gktjweb.common.HttpClientUtil;
import com.zr.gktjweb.common.ResponseBean;
import com.zr.gktjweb.constant.SysCode;
import com.zr.gktjweb.model.SysUser;
import com.zr.gktjweb.util.ComUtil;
import com.zr.gktjweb.util.JSONUtils;
import com.zr.gktjweb.util.UserUtil;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import net.sf.json.JSONObject;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;

import javax.servlet.http.HttpServletRequest;
import java.util.HashMap;
import java.util.Map;

@Api(tags = "登錄")
@Controller
public class LoginController {
    @Value("${baseurl}")
    private String baseurl;
    @Value("${login_url}")
    private String loginUrl;
    @Value("${logout_url}")
    private String logoutUrl;
    @Value("${syslogin_url}")
    private String sysloginUrl;
    @Value("${updateUserSessionByusername_url}")
    private String updateUserSessionByusernameUrl;
    @Value("${updatePass_url}")
    private String updatePassUrl;
    private static final Logger LOGGER = LoggerFactory.getLogger(LoginController.class);

    @ApiOperation(value = "登錄", notes = "登錄驗證")
    @ApiImplicitParams({@ApiImplicitParam(name = "username", value = "姓名", required = true, dataType = "String"),
            @ApiImplicitParam(name = "password", value = "密碼", required = true, dataType = "String")
    })
    @RequestMapping(value = "/login.do", method = RequestMethod.POST)
    @ResponseBody
    public ResponseBean login(String username, String password) {
        String url = baseurl + loginUrl;
        Map<String, String> map = new HashMap<>();
        map.put("username", username);
        map.put("password", password);
        String result = "";
        new AsyThread().run();
        System.out.println("--------當前線程--------"+Thread.currentThread().getName());
        //請求服務(wù)失敗
        try {
            result = HttpClientUtil.doPost(url, map);
        } catch (Exception e) {
            e.printStackTrace();
            LOGGER.error("用戶登錄", e);
            return new ResponseBean(SysCode.errCode, "系統(tǒng)異常,請聯(lián)系管理員", "");
        }
        JSONObject json = JSONObject.fromObject(result);
        //登錄驗證未通過
        if (!json.getString("code").equals(SysCode.successCode + "")) {
            ResponseBean responseBean = JSONUtils.jsonToObject(ResponseBean.class, result);
            return responseBean;
        }
        //驗證通過,在session中設(shè)置token
        JSONObject dataJson = (JSONObject) json.get("data");
        String userJson = dataJson.getString("user");
        SysUser sysUser = JSONUtils.jsonToObject(SysUser.class, userJson);
        JSONObject tokenJson = (JSONObject) dataJson.get("token");
        String token = tokenJson.getString("token");
        UserUtil.setToken(token);
        UserUtil.setUserSession(sysUser);
        //第一次登陸修改密碼
        if(ComUtil.isEmpty(sysUser.getLastlogindate())){
            return new ResponseBean(SysCode.retPwdCode, "", "");
        }
        String url1 = "/index.html";
        Map<String, Object> resMap = new HashMap<>();
        resMap.put("url", url1);
        return new ResponseBean(SysCode.successCode, "登錄成功", resMap);
    }

    /**
     * 注銷登錄
     *
     * @param request
     * @return
     */
    @RequestMapping("/loginout.do")
    public String loginOut(HttpServletRequest request) {
        request.getSession().invalidate();
        String url=baseurl+logoutUrl;
        HttpClientUtil.doGet(url);
        return "redirect:/";
    }

    @PostMapping("/users/updatePass.do")
    @ApiOperation(value = "修改密碼")
    @ResponseBody
    public ResponseBean changePassword(String username, String oldPassword, String newPassword) {
        String url = baseurl + updatePassUrl;
        Map<String, String> map = new HashMap<>();
        map.put("username", username);
        map.put("oldPassword", oldPassword);
        map.put("newPassword", newPassword);
        String result = HttpClientUtil.doPost(url, map);
        ResponseBean responseBean = JSONUtils.jsonToObject(ResponseBean.class, result);
        //修改密碼后重新登錄
        ResponseBean loginResult=login(username,newPassword);
        //登錄驗證未通過
        if (!loginResult.getCode().toString().equals(SysCode.successCode + "")) {
            return loginResult;
        }
        return responseBean;
    }

    @ApiOperation(value = "當前登錄用戶")
    @GetMapping("/sys/login.do")
    @ResponseBody
    public SysUser getLoginInfo() {
        return UserUtil.getCurrentUser();
    }
}

調(diào)用controller層后結(jié)果如下:

實現(xiàn)異步失敗。

5、后改為將實現(xiàn)異步的類

注入到controller層。通過spring生成的bean來調(diào)用異步方法:

package com.zr.gktjweb.aspect;

import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Component;

@Component
public class AsyThread {
//    @Override
    @Async
    public void run() {
        System.out.println("---------異步線程---------"+Thread.currentThread().getName());
    }
}

package com.zr.gktjweb.controller.login;

import com.zr.gktjweb.aspect.AsyThread;
import com.zr.gktjweb.common.HttpClientUtil;
import com.zr.gktjweb.common.ResponseBean;
import com.zr.gktjweb.constant.SysCode;
import com.zr.gktjweb.model.SysUser;
import com.zr.gktjweb.util.ComUtil;
import com.zr.gktjweb.util.JSONUtils;
import com.zr.gktjweb.util.UserUtil;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import net.sf.json.JSONObject;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;

import javax.servlet.http.HttpServletRequest;
import java.util.HashMap;
import java.util.Map;

@Api(tags = "登錄")
@Controller
public class LoginController {
    @Value("${baseurl}")
    private String baseurl;
    @Value("${login_url}")
    private String loginUrl;
    @Value("${logout_url}")
    private String logoutUrl;
    @Value("${syslogin_url}")
    private String sysloginUrl;
    @Value("${updateUserSessionByusername_url}")
    private String updateUserSessionByusernameUrl;
    @Value("${updatePass_url}")
    private String updatePassUrl;
    private static final Logger LOGGER = LoggerFactory.getLogger(LoginController.class);

    @Autowired
    AsyThread asyThread;


    @ApiOperation(value = "登錄", notes = "登錄驗證")
    @ApiImplicitParams({@ApiImplicitParam(name = "username", value = "姓名", required = true, dataType = "String"),
            @ApiImplicitParam(name = "password", value = "密碼", required = true, dataType = "String")
    })
    @RequestMapping(value = "/login.do", method = RequestMethod.POST)
    @ResponseBody
    public ResponseBean login(String username, String password) {
        String url = baseurl + loginUrl;
        Map<String, String> map = new HashMap<>();
        map.put("username", username);
        map.put("password", password);
        String result = "";
        asyThread.run();
        System.out.println("--------當前線程--------"+Thread.currentThread().getName());
        //請求服務(wù)失敗
        try {
            result = HttpClientUtil.doPost(url, map);
        } catch (Exception e) {
            e.printStackTrace();
            LOGGER.error("用戶登錄", e);
            return new ResponseBean(SysCode.errCode, "系統(tǒng)異常,請聯(lián)系管理員", "");
        }
        JSONObject json = JSONObject.fromObject(result);
        //登錄驗證未通過
        if (!json.getString("code").equals(SysCode.successCode + "")) {
            ResponseBean responseBean = JSONUtils.jsonToObject(ResponseBean.class, result);
            return responseBean;
        }
        //驗證通過,在session中設(shè)置token
        JSONObject dataJson = (JSONObject) json.get("data");
        String userJson = dataJson.getString("user");
        SysUser sysUser = JSONUtils.jsonToObject(SysUser.class, userJson);
        JSONObject tokenJson = (JSONObject) dataJson.get("token");
        String token = tokenJson.getString("token");
        UserUtil.setToken(token);
        UserUtil.setUserSession(sysUser);
        //第一次登陸修改密碼
        if(ComUtil.isEmpty(sysUser.getLastlogindate())){
            return new ResponseBean(SysCode.retPwdCode, "", "");
        }
        String url1 = "/index.html";
        Map<String, Object> resMap = new HashMap<>();
        resMap.put("url", url1);
        return new ResponseBean(SysCode.successCode, "登錄成功", resMap);
    }

    /**
     * 注銷登錄
     *
     * @param request
     * @return
     */
    @RequestMapping("/loginout.do")
    public String loginOut(HttpServletRequest request) {
        request.getSession().invalidate();
        String url=baseurl+logoutUrl;
        HttpClientUtil.doGet(url);
        return "redirect:/";
    }

    @PostMapping("/users/updatePass.do")
    @ApiOperation(value = "修改密碼")
    @ResponseBody
    public ResponseBean changePassword(String username, String oldPassword, String newPassword) {
        String url = baseurl + updatePassUrl;
        Map<String, String> map = new HashMap<>();
        map.put("username", username);
        map.put("oldPassword", oldPassword);
        map.put("newPassword", newPassword);
        String result = HttpClientUtil.doPost(url, map);
        ResponseBean responseBean = JSONUtils.jsonToObject(ResponseBean.class, result);
        //修改密碼后重新登錄
        ResponseBean loginResult=login(username,newPassword);
        //登錄驗證未通過
        if (!loginResult.getCode().toString().equals(SysCode.successCode + "")) {
            return loginResult;
        }
        return responseBean;
    }

    @ApiOperation(value = "當前登錄用戶")
    @GetMapping("/sys/login.do")
    @ResponseBody
    public SysUser getLoginInfo() {
        return UserUtil.getCurrentUser();
    }
}

訪問contrller層后,結(jié)果如下:

成功實現(xiàn)異步。

總結(jié)

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • JAVA中判空方法isEmpty()用法舉例詳解

    JAVA中判空方法isEmpty()用法舉例詳解

    這篇文章主要給大家介紹了關(guān)于JAVA中判空方法isEmpty()用法的相關(guān)資料,isEmpty()是Java中常用的方法之一,用于判斷集合、字符串、數(shù)組等是否為空,文中通過代碼將解決的辦法介紹的非常詳細,需要的朋友可以參考下
    2024-06-06
  • java WebSocket客戶端斷線重連的實現(xiàn)方法

    java WebSocket客戶端斷線重連的實現(xiàn)方法

    在工作中是否會遇到實用websocket客戶端連接服務(wù)端的時候,網(wǎng)絡(luò)波動,服務(wù)端斷連的情況,本文可以直接使用的斷線重連,感興趣的可以了解一下
    2021-10-10
  • java算法實現(xiàn)預(yù)測雙色球中獎號碼

    java算法實現(xiàn)預(yù)測雙色球中獎號碼

    這篇文章主要介紹了java算法實現(xiàn)預(yù)測雙色球中獎號碼的相關(guān)資料,需要的朋友可以參考下
    2015-12-12
  • 批量將現(xiàn)有Jar包上傳到Maven私服

    批量將現(xiàn)有Jar包上傳到Maven私服

    今天小編就為大家分享一篇關(guān)于批量將現(xiàn)有Jar包上傳到Maven私服,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2018-12-12
  • 詳解java數(shù)據(jù)結(jié)構(gòu)與算法之雙鏈表設(shè)計與實現(xiàn)

    詳解java數(shù)據(jù)結(jié)構(gòu)與算法之雙鏈表設(shè)計與實現(xiàn)

    本篇文章主要介紹了詳解java數(shù)據(jù)結(jié)構(gòu)與算法之雙鏈表設(shè)計與實現(xiàn),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-06-06
  • maven中更改jdk版本的方法實現(xiàn)

    maven中更改jdk版本的方法實現(xiàn)

    本文主要介紹了maven中更改jdk版本的方法實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-07-07
  • Spring自定義配置Schema可擴展(一)

    Spring自定義配置Schema可擴展(一)

    本教程主要介紹如何擴展Spring的xml配置,讓Spring能夠識別我們自定義的Schema和Annotation,,需要的朋友可以參考下
    2016-01-01
  • PageHelper插件實現(xiàn)服務(wù)器端分頁功能

    PageHelper插件實現(xiàn)服務(wù)器端分頁功能

    這篇文章主要為大家詳細介紹了PageHelper插件實現(xiàn)服務(wù)器端分頁功能,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-07-07
  • 解析Hibernate + MySQL中文亂碼問題

    解析Hibernate + MySQL中文亂碼問題

    如果持久化的類中有包括了漢字的String對象,那么對應(yīng)到數(shù)據(jù)庫中漢字的部分就會是亂碼。這主要是由于MySQL數(shù)據(jù)表的字符集與我們當前使用的本地字符集不相同造成的
    2013-07-07
  • Java多線程鎖機制相關(guān)原理實例解析

    Java多線程鎖機制相關(guān)原理實例解析

    這篇文章主要介紹了Java多線程鎖機制相關(guān)原理實例解析,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-08-08

最新評論