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

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

 更新時(shí)間:2024年12月12日 15:54:03   作者:aiyongbo123456  
在Spring Boot中實(shí)現(xiàn)異步方法時(shí),如果直接在調(diào)用類(lèi)中使用`@Async`注解,可能會(huì)導(dǎo)致異步失敗,正確的做法是將實(shí)現(xiàn)異步的方法放在一個(gè)獨(dú)立的類(lèi)中,并通過(guò)Spring生成的bean來(lái)調(diào)用這個(gè)方法,這樣可以成功實(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中判空方法isEmpty()用法舉例詳解

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

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

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

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

    java算法實(shí)現(xiàn)預(yù)測(cè)雙色球中獎(jiǎng)號(hào)碼

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

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

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

    詳解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-06
  • maven中更改jdk版本的方法實(shí)現(xiàn)

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

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

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

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

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

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

    解析Hibernate + MySQL中文亂碼問(wèn)題

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

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

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

最新評(píng)論