最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Spring?Boot小型項(xiàng)目如何使用異步任務(wù)管理器實(shí)現(xiàn)不同業(yè)務(wù)間的解耦

 更新時(shí)間:2022年08月02日 14:31:17   作者:Java升級(jí)之路???????  
這篇文章主要介紹了Spring?Boot小型項(xiàng)目如何使用異步任務(wù)管理器實(shí)現(xiàn)不同業(yè)務(wù)間的解耦,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下

前言

在有些業(yè)務(wù)場景中,系統(tǒng)對(duì)于響應(yīng)時(shí)間有一定的要求,而一個(gè)方法里面同步執(zhí)行的業(yè)務(wù)邏輯太多勢必會(huì)影響響應(yīng)速度,帶來不好的用戶體驗(yàn)。比如登錄時(shí)記錄登錄用戶的訪問記錄、注冊(cè)時(shí)發(fā)送郵件、短信通知等等場景,不需要等待處理結(jié)果之后再進(jìn)行下一步操作,這時(shí)候就可以使用異步線程進(jìn)行處理,這樣主線程不會(huì)因?yàn)檫@些耗時(shí)的操作而阻塞,保證主線程的流程可以正常進(jìn)行。

異步任務(wù)可以通過多線程也可以通過消息隊(duì)列來實(shí)現(xiàn),目的都是為了實(shí)現(xiàn)不同業(yè)務(wù)之間的解耦,提高業(yè)務(wù)系統(tǒng)的響應(yīng)速度。但是相對(duì)于小型系統(tǒng)采用多線程的方式相對(duì)更便捷,所以,這篇文章就記錄一下我是如何使用多線程實(shí)現(xiàn)異步任務(wù)管理器來記錄訪問日志的。

一、異步任務(wù)管理器是什么?

顧名思義,就是用來對(duì)異步任務(wù)進(jìn)行統(tǒng)一的管理,并提供了一種訪問其唯一對(duì)象的方式,這樣做的好處就是,在內(nèi)存中有且僅有一個(gè)實(shí)例,減少了內(nèi)存的開銷,尤其對(duì)于頻繁的創(chuàng)建和銷毀實(shí)例,用這種方式來頻繁執(zhí)行多個(gè)異步任務(wù)性能是相對(duì)比較好的。

二、實(shí)現(xiàn)步驟

1.自定義線程池

執(zhí)行異步任務(wù)時(shí),需要將執(zhí)行的任務(wù)放入到線程池中,所以需配置好我們的線程池。并創(chuàng)建一個(gè)調(diào)度線程池執(zhí)行器,用來執(zhí)行異步任務(wù)。

代碼如下(示例):

2. 新建異步任務(wù)管理器類

代碼如下(示例):

public class AsyncManager {
    /**
     * 操作延遲10毫秒
     */
    private final int OPERATE_DELAY_TIME = 10;
    /**
     * 異步操作任務(wù)調(diào)度線程池
     */
    private ScheduledExecutorService executor = SpringUtils.getBean("scheduledExecutorService");
    /**
     * 餓漢式單例模式
     */
    private AsyncManager(){}

    private static AsyncManager me = new AsyncManager();

    public static AsyncManager me() {
        return me;
    }
    /**
     * 執(zhí)行任務(wù)
     * @param task 任務(wù)
     */
    public void execute(TimerTask task) {
        executor.schedule(task, OPERATE_DELAY_TIME, TimeUnit.MILLISECONDS);
    }

3. 新建異步工廠類

設(shè)計(jì)這個(gè)類主要是用來產(chǎn)生 TimerTask 的,代碼如下(示例):

@Slf4j
public class AsyncFactory {
    /**
     * 記錄登錄信息
     * @param username 用戶名
     * @param status 狀態(tài)
     * @param message 消息
     * @param args 列表
     * @return 任務(wù)task
     */
    public static TimerTask recordLoginLog(final String username, final String status, final String message,final Object... args) {
        // 客戶端操作系統(tǒng)、瀏覽器等信息
        final UserAgent userAgent = UserAgentUtil.parse(ServletUtils.getRequest().getHeader("User-Agent"));
        // 請(qǐng)求的IP地址
        final String ip = ServletUtil.getClientIP(ServletUtils.getRequest());
        return new TimerTask() {
            @Override
            public void run() {
                String address = AddressUtils.getRealAddressByIp(ip);
                // 獲取客戶端操作系統(tǒng)
                String os = userAgent.getOs().getName();
                // 獲取客戶端瀏覽器
                String browser = userAgent.getBrowser().getName();
                // 封裝對(duì)象
                XlLoginLog loginLog = new XlLoginLog();
                loginLog.setUserCode(username);
                loginLog.setIpaddr(ip);
                loginLog.setLoginLocation(address);
                loginLog.setBrowser(browser);
                loginLog.setOs(os);
                loginLog.setMsg(message);
                loginLog.setLoginTime(new Date());
                // 日志狀態(tài)
                if (Constants.LOGIN_FAIL.equals(status)) {
                    loginLog.setStatus(Integer.valueOf(Constants.FAIL));
                } else {
                    loginLog.setStatus(Integer.valueOf(Constants.SUCCESS));
                }
                // 插入數(shù)據(jù)
                SpringUtils.getBean(IXlLoginLogService.class).create(loginLog);
            }
        };
    }
}

4. 調(diào)用

例如:在登錄的方法中鏈?zhǔn)秸{(diào)用,與同步方式不同,開發(fā)者不用考慮當(dāng)進(jìn)行登錄操作是否進(jìn)行日志操作,在異步的方式中,業(yè)務(wù)的操作與日志的操作分開來。執(zhí)行流程:AsyncManager.me()獲取一個(gè)AsyncManager對(duì)象,執(zhí)行execute方法,執(zhí)行任務(wù),傳入的是一個(gè)task對(duì)象。實(shí)現(xiàn)了Runnable接口,是一個(gè)任務(wù),由線程Thread去執(zhí)行。

recordLoginLog方法返回的是TimerTask定時(shí)任務(wù)類,將用戶登錄信息記錄到日志中作為一個(gè)定時(shí)任務(wù),交給定時(shí)任務(wù)調(diào)度線程池scheduledExecutorService,scheduledExecutorService通過在異步任務(wù)管理器類中,用getBean()從IOC容器中獲取。

5. 實(shí)現(xiàn)效果

進(jìn)行登錄操作時(shí),會(huì)異步進(jìn)行日志的記錄。

總結(jié)

到此這篇關(guān)于Spring Boot小型項(xiàng)目如何使用異步任務(wù)管理器實(shí)現(xiàn)不同業(yè)務(wù)間的解耦的文章就介紹到這了,更多相關(guān)Spring Boot實(shí)現(xiàn)不同業(yè)務(wù)間解耦內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java中mkdir()和mkdirs()的區(qū)別及說明

    Java中mkdir()和mkdirs()的區(qū)別及說明

    這篇文章主要介紹了Java中mkdir()和mkdirs()的區(qū)別及說明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-11-11
  • SpringBoot如何通過Map實(shí)現(xiàn)策略模式

    SpringBoot如何通過Map實(shí)現(xiàn)策略模式

    策略模式是一種行為設(shè)計(jì)模式,它允許在運(yùn)行時(shí)選擇算法的行為,在Spring框架中,我們可以利用@Resource注解和Map集合來優(yōu)雅地實(shí)現(xiàn)策略模式,這篇文章主要介紹了SpringBoot如何通過Map實(shí)現(xiàn)策略模式,需要的朋友可以參考下
    2025-03-03
  • java volatile案例講解

    java volatile案例講解

    這篇文章主要介紹了java volatile案例講解,本文通過講解內(nèi)存可見性,Volatile變量來去詳細(xì)分析該項(xiàng)概念,需要的朋友可以參考下
    2021-07-07
  • Spring手動(dòng)獲取bean的四種方式

    Spring手動(dòng)獲取bean的四種方式

    本文主要介紹了Spring手動(dòng)獲取bean的四種方式,包括BeanFactoryPostProcessor接口,ApplicationContextAware接口,注解 @PostConstruct 初始化時(shí)獲取,啟動(dòng)類ApplicationContext獲取這四種方法,感興趣的可以了解一下
    2024-01-01
  • 使用Spring Security集成手機(jī)驗(yàn)證碼登錄功能實(shí)現(xiàn)

    使用Spring Security集成手機(jī)驗(yàn)證碼登錄功能實(shí)現(xiàn)

    本文詳細(xì)介紹了如何利用SpringSecurity來實(shí)現(xiàn)手機(jī)驗(yàn)證碼的注冊(cè)和登錄功能,在登錄過程中,同樣需通過驗(yàn)證碼進(jìn)行驗(yàn)證,文章還提供了相關(guān)的代碼實(shí)現(xiàn)
    2024-10-10
  • 一文搞明白Java?Spring?Boot分布式事務(wù)解決方案

    一文搞明白Java?Spring?Boot分布式事務(wù)解決方案

    這篇文章主要介紹了一文搞明白Java?Spring?Boot分布式事務(wù)解決方案,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下
    2022-07-07
  • Spring Boot集成Shiro實(shí)現(xiàn)動(dòng)態(tài)加載權(quán)限的完整步驟

    Spring Boot集成Shiro實(shí)現(xiàn)動(dòng)態(tài)加載權(quán)限的完整步驟

    這篇文章主要給大家介紹了關(guān)于Spring Boot集成Shiro實(shí)現(xiàn)動(dòng)態(tài)加載權(quán)限的完整步驟,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用Spring Boot具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-09-09
  • Java 獲取properties的幾種方式

    Java 獲取properties的幾種方式

    這篇文章主要介紹了Java 獲取properties的幾種方式,幫助大家更好的理解和學(xué)習(xí)使用Java,感興趣的朋友可以了解下
    2021-04-04
  • Java多線程并發(fā)之ReentrantLock

    Java多線程并發(fā)之ReentrantLock

    這篇文章主要介紹了Java?多線程并發(fā)ReentrantLock,文中有非常詳細(xì)的代碼示例,對(duì)正在學(xué)習(xí)java的小伙伴們有非常好的幫助,需要的朋友可以參考下
    2023-04-04
  • Spring Bean 依賴注入常見錯(cuò)誤問題

    Spring Bean 依賴注入常見錯(cuò)誤問題

    這篇文章主要介紹了Spring Bean 依賴注入常見錯(cuò)誤問題,文中提到value的工作大體分為三個(gè)核心步驟,具體內(nèi)容詳情跟隨小編一起看看吧
    2021-09-09

最新評(píng)論

镇安县| 天祝| 石门县| 五河县| 惠东县| 平凉市| 伊川县| 兴义市| 托克逊县| 绿春县| 昌吉市| 吉林省| 南召县| 师宗县| 大理市| 福海县| 斗六市| 赣州市| 洪泽县| 永春县| 正蓝旗| 邯郸县| 永德县| 高唐县| 丹东市| 密山市| 红原县| 灵璧县| 丹凤县| 将乐县| 澳门| 财经| 五台县| 文昌市| 江川县| 泗洪县| 克拉玛依市| 龙里县| 安庆市| 石泉县| 和政县|