您好,登錄后才能下訂單哦!
本篇內容介紹了“Spring Boot小型項目怎么使用異步任務管理器實現不同業務間的解耦”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!
顧名思義,就是用來對異步任務進行統一的管理,并提供了一種訪問其唯一對象的方式,這樣做的好處就是,在內存中有且僅有一個實例,減少了內存的開銷,尤其對于頻繁的創建和銷毀實例,用這種方式來頻繁執行多個異步任務性能是相對比較好的。
執行異步任務時,需要將執行的任務放入到線程池中,所以需配置好我們的線程池。并創建一個調度線程池執行器,用來執行異步任務。
代碼如下(示例):
代碼如下(示例):
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); }
設計這個類主要是用來產生 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); } }; } }
例如:在登錄的方法中鏈式調用,與同步方式不同,開發者不用考慮當進行登錄操作是否進行日志操作,在異步的方式中,業務的操作與日志的操作分開來。執行流程:AsyncManager.me()獲取一個AsyncManager對象,執行execute方法,執行任務,傳入的是一個task對象。實現了Runnable接口,是一個任務,由線程Thread去執行。
recordLoginLog方法返回的是TimerTask定時任務類,將用戶登錄信息記錄到日志中作為一個定時任務,交給定時任務調度線程池scheduledExecutorService,scheduledExecutorService通過在異步任務管理器類中,用getBean()從IOC容器中獲取。
進行登錄操作時,會異步進行日志的記錄。
“Spring Boot小型項目怎么使用異步任務管理器實現不同業務間的解耦”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。