springboot如何通過(guò)注解實(shí)現(xiàn)多線程
springboot通過(guò)注解實(shí)現(xiàn)多線程
1、springboot啟動(dòng)類中添加 @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)用類之外的另一個(gè)類方法中添加

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、在另一個(gè)類中調(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 = "登錄驗(yàn)證")
@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("--------當(dāng)前線程--------"+Thread.currentThread().getName());
//請(qǐng)求服務(wù)失敗
try {
result = HttpClientUtil.doPost(url, map);
} catch (Exception e) {
e.printStackTrace();
LOGGER.error("用戶登錄", e);
return new ResponseBean(SysCode.errCode, "系統(tǒng)異常,請(qǐng)聯(lián)系管理員", "");
}
JSONObject json = JSONObject.fromObject(result);
//登錄驗(yàn)證未通過(guò)
if (!json.getString("code").equals(SysCode.successCode + "")) {
ResponseBean responseBean = JSONUtils.jsonToObject(ResponseBean.class, result);
return responseBean;
}
//驗(yàn)證通過(guò),在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);
//登錄驗(yàn)證未通過(guò)
if (!loginResult.getCode().toString().equals(SysCode.successCode + "")) {
return loginResult;
}
return responseBean;
}
@ApiOperation(value = "當(dāng)前登錄用戶")
@GetMapping("/sys/login.do")
@ResponseBody
public SysUser getLoginInfo() {
return UserUtil.getCurrentUser();
}
}調(diào)用controller層后結(jié)果如下:

實(shí)現(xiàn)異步失敗。
5、后改為將實(shí)現(xiàn)異步的類
注入到controller層。通過(guò)spring生成的bean來(lái)調(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 = "登錄驗(yàn)證")
@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("--------當(dāng)前線程--------"+Thread.currentThread().getName());
//請(qǐng)求服務(wù)失敗
try {
result = HttpClientUtil.doPost(url, map);
} catch (Exception e) {
e.printStackTrace();
LOGGER.error("用戶登錄", e);
return new ResponseBean(SysCode.errCode, "系統(tǒng)異常,請(qǐng)聯(lián)系管理員", "");
}
JSONObject json = JSONObject.fromObject(result);
//登錄驗(yàn)證未通過(guò)
if (!json.getString("code").equals(SysCode.successCode + "")) {
ResponseBean responseBean = JSONUtils.jsonToObject(ResponseBean.class, result);
return responseBean;
}
//驗(yàn)證通過(guò),在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);
//登錄驗(yàn)證未通過(guò)
if (!loginResult.getCode().toString().equals(SysCode.successCode + "")) {
return loginResult;
}
return responseBean;
}
@ApiOperation(value = "當(dāng)前登錄用戶")
@GetMapping("/sys/login.do")
@ResponseBody
public SysUser getLoginInfo() {
return UserUtil.getCurrentUser();
}
}訪問(wèn)contrller層后,結(jié)果如下:

成功實(shí)現(xiàn)異步。
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
SpringBoot 如何實(shí)現(xiàn)異步編程
在SpringBoot的日常開(kāi)發(fā)中,一般都是同步調(diào)用的,但實(shí)際中有很多場(chǎng)景非常適合使用異步來(lái)處理,本文就詳細(xì)的介紹一下SpringBoot 如何實(shí)現(xiàn)異步編程 ,具有一定的參考價(jià)值,感興趣的可以了解一下2021-12-12
實(shí)例講解Java的Spring框架中的AOP實(shí)現(xiàn)
這篇文章主要介紹了Java的Spring框架中的AOP實(shí)現(xiàn)實(shí)例,AOP面向切面編程其實(shí)也可以被看作是一個(gè)設(shè)計(jì)模式去規(guī)范項(xiàng)目的結(jié)構(gòu),需要的朋友可以參考下2016-04-04
java實(shí)現(xiàn)檢測(cè)是否字符串中包含中文
本文給大家分享了2個(gè)使用java檢測(cè)字符串中是否包含中文的代碼,都非常的實(shí)用,最后附上了各種字符的unicode編碼的范圍,方便我們以后使用正則進(jìn)行匹配檢測(cè)。2015-10-10
Spring boot實(shí)現(xiàn)應(yīng)用打包部署的示例
本篇文章主要介紹了Spring boot實(shí)現(xiàn)應(yīng)用打包部署的示例,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-11-11
Spring5+SpringMvc+Hibernate5整合的實(shí)現(xiàn)
這篇文章主要介紹了Spring5+SpringMvc+Hibernate5整合的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-06-06
ElasticSearch如何設(shè)置某個(gè)字段不分詞淺析
最近在學(xué)習(xí)ElasticSearch官方文檔過(guò)程中發(fā)現(xiàn)的某個(gè)問(wèn)題,記錄一下 希望能幫助到后面的朋友,下面這篇文章主要給大家介紹了關(guān)于ElasticSearch如何設(shè)置某個(gè)字段不分詞的相關(guān)資料,需要的朋友可以參考下2022-04-04
淺談Java實(shí)現(xiàn)回溯算法之八皇后問(wèn)題
八皇后問(wèn)題是一個(gè)古老而又著名的問(wèn)題,是學(xué)習(xí)回溯算法的一個(gè)經(jīng)典案例。今天我們就一起來(lái)探究一下吧2021-06-06
JVM實(shí)戰(zhàn)系列之CPU100%和內(nèi)存100%排查
本文主要介紹了JVM實(shí)戰(zhàn)系列之CPU100%和內(nèi)存100%排查,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-06-06

