Spring Boot小型项目怎么使用异步任务管理器实现不同业务间的解耦
本篇内容介绍了“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容器中获取。
5. 实现效果
进行登录操作时,会异步进行日志的记录。
“Spring Boot小型项目怎么使用异步任务管理器实现不同业务间的解耦”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注蜗牛博客网站,小编将为大家输出更多高质量的实用文章!
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:niceseo99@gmail.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。
评论