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容器中获取。

    Spring Boot小型项目怎么使用异步任务管理器实现不同业务间的解耦  springboot 第1张

    5. 实现效果

    进行登录操作时,会异步进行日志的记录。

    Spring Boot小型项目怎么使用异步任务管理器实现不同业务间的解耦  springboot 第2张

    “Spring Boot小型项目怎么使用异步任务管理器实现不同业务间的解耦”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注蜗牛博客网站,小编将为大家输出更多高质量的实用文章!

    免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:niceseo99@gmail.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

    评论

    有免费节点资源,我们会通知你!加入纸飞机订阅群

    ×
    天气预报查看日历分享网页手机扫码留言评论Telegram