91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》
  • 首頁 > 
  • 教程 > 
  • 開發技術 > 
  • Spring?Boot小型項目怎么使用異步任務管理器實現不同業務間的解耦

Spring?Boot小型項目怎么使用異步任務管理器實現不同業務間的解耦

發布時間:2022-08-04 10:43:52 來源:億速云 閱讀:158 作者:iii 欄目:開發技術

本篇內容介紹了“Spring Boot小型項目怎么使用異步任務管理器實現不同業務間的解耦”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!

    一、異步任務管理器是什么?

    顧名思義,就是用來對異步任務進行統一的管理,并提供了一種訪問其唯一對象的方式,這樣做的好處就是,在內存中有且僅有一個實例,減少了內存的開銷,尤其對于頻繁的創建和銷毀實例,用這種方式來頻繁執行多個異步任務性能是相對比較好的。

    二、實現步驟

    1.自定義線程池

    執行異步任務時,需要將執行的任務放入到線程池中,所以需配置好我們的線程池。并創建一個調度線程池執行器,用來執行異步任務。

    代碼如下(示例):

    2. 新建異步任務管理器類

    代碼如下(示例):

    public class AsyncManager {
        /**
         * 操作延遲10毫秒
         */
        private final int OPERATE_DELAY_TIME = 10;
        /**
         * 異步操作任務調度線程池
         */
        private ScheduledExecutorService executor = SpringUtils.getBean("scheduledExecutorService");
        /**
         * 餓漢式單例模式
         */
        private AsyncManager(){}
    
        private static AsyncManager me = new AsyncManager();
    
        public static AsyncManager me() {
            return me;
        }
        /**
         * 執行任務
         * @param task 任務
         */
        public void execute(TimerTask task) {
            executor.schedule(task, OPERATE_DELAY_TIME, TimeUnit.MILLISECONDS);
        }

    3. 新建異步工廠類

    設計這個類主要是用來產生 TimerTask 的,代碼如下(示例):

    @Slf4j
    public class AsyncFactory {
        /**
         * 記錄登錄信息
         * @param username 用戶名
         * @param status 狀態
         * @param message 消息
         * @param args 列表
         * @return 任務task
         */
        public static TimerTask recordLoginLog(final String username, final String status, final String message,final Object... args) {
            // 客戶端操作系統、瀏覽器等信息
            final UserAgent userAgent = UserAgentUtil.parse(ServletUtils.getRequest().getHeader("User-Agent"));
            // 請求的IP地址
            final String ip = ServletUtil.getClientIP(ServletUtils.getRequest());
            return new TimerTask() {
                @Override
                public void run() {
                    String address = AddressUtils.getRealAddressByIp(ip);
                    // 獲取客戶端操作系統
                    String os = userAgent.getOs().getName();
                    // 獲取客戶端瀏覽器
                    String browser = userAgent.getBrowser().getName();
                    // 封裝對象
                    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());
                    // 日志狀態
                    if (Constants.LOGIN_FAIL.equals(status)) {
                        loginLog.setStatus(Integer.valueOf(Constants.FAIL));
                    } else {
                        loginLog.setStatus(Integer.valueOf(Constants.SUCCESS));
                    }
                    // 插入數據
                    SpringUtils.getBean(IXlLoginLogService.class).create(loginLog);
                }
            };
        }
    }

    4. 調用

    例如:在登錄的方法中鏈式調用,與同步方式不同,開發者不用考慮當進行登錄操作是否進行日志操作,在異步的方式中,業務的操作與日志的操作分開來。執行流程:AsyncManager.me()獲取一個AsyncManager對象,執行execute方法,執行任務,傳入的是一個task對象。實現了Runnable接口,是一個任務,由線程Thread去執行。

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

    Spring?Boot小型項目怎么使用異步任務管理器實現不同業務間的解耦

    5. 實現效果

    進行登錄操作時,會異步進行日志的記錄。

    Spring?Boot小型項目怎么使用異步任務管理器實現不同業務間的解耦

    “Spring Boot小型項目怎么使用異步任務管理器實現不同業務間的解耦”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!

    向AI問一下細節

    免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

    AI

    曲水县| 酒泉市| 陇川县| 会理县| 英吉沙县| 泾阳县| 辉南县| 奉新县| 马尔康县| 汕头市| 清丰县| 彰化市| 五台县| 安西县| 沭阳县| 平陆县| 隆安县| 社会| 台山市| 马龙县| 印江| 靖安县| 潍坊市| 马山县| 株洲市| 天全县| 石嘴山市| 深泽县| 沙田区| 凉山| 松原市| 西乌| 镇原县| 大名县| 北安市| 道真| 綦江县| 苍山县| 静安区| 内江市| 文成县|