springboot如何通過(guò)注解實(shí)現(xiàn)多線程
springboot通過(guò)注解實(shí)現(xiàn)多線程
1、springboot啟動(dòng)類(lèi)中添加 @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)用類(lèi)之外的另一個(gè)類(lèi)方法中添加
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è)類(lèi)中調(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); } /** * 注銷(xiāo)登錄 * * @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)異步的類(lèi)
注入到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); } /** * 注銷(xiāo)登錄 * * @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)文章
java WebSocket客戶端斷線重連的實(shí)現(xiàn)方法
在工作中是否會(huì)遇到實(shí)用websocket客戶端連接服務(wù)端的時(shí)候,網(wǎng)絡(luò)波動(dòng),服務(wù)端斷連的情況,本文可以直接使用的斷線重連,感興趣的可以了解一下2021-10-10java算法實(shí)現(xiàn)預(yù)測(cè)雙色球中獎(jiǎng)號(hào)碼
這篇文章主要介紹了java算法實(shí)現(xiàn)預(yù)測(cè)雙色球中獎(jiǎng)號(hào)碼的相關(guān)資料,需要的朋友可以參考下2015-12-12詳解java數(shù)據(jù)結(jié)構(gòu)與算法之雙鏈表設(shè)計(jì)與實(shí)現(xiàn)
本篇文章主要介紹了詳解java數(shù)據(jù)結(jié)構(gòu)與算法之雙鏈表設(shè)計(jì)與實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-06-06PageHelper插件實(shí)現(xiàn)服務(wù)器端分頁(yè)功能
這篇文章主要為大家詳細(xì)介紹了PageHelper插件實(shí)現(xiàn)服務(wù)器端分頁(yè)功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-07-07解析Hibernate + MySQL中文亂碼問(wèn)題
如果持久化的類(lèi)中有包括了漢字的String對(duì)象,那么對(duì)應(yīng)到數(shù)據(jù)庫(kù)中漢字的部分就會(huì)是亂碼。這主要是由于MySQL數(shù)據(jù)表的字符集與我們當(dāng)前使用的本地字符集不相同造成的2013-07-07Java多線程鎖機(jī)制相關(guān)原理實(shí)例解析
這篇文章主要介紹了Java多線程鎖機(jī)制相關(guān)原理實(shí)例解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-08-08