若依在登录的时候会使用到线程池来进行日志记录如下所示。
在若依项目中配置了两个线程池,当项目启动时,线程池会初始化被spring管理。
不过若依项目中只是用到了第二个线程池,@Bean(name = "scheduledExecutorService")
后面我会讲怎么使用第一个线程池。
1、scheduledExecutorService
我往第二个线程池加了点注释如下
在异步任务管理器当中取了了该线程池,并且提供了两个方法,一个执行任务,第二个在项目结束时(通过这个@PreDestroy注解)会被调用,关闭该线程池。
停止项目时的日志
当我们需要使用该线程池时,只需要传入一个TimerTask类型的参数就行。如下图当中的
AsyncFactory.recordLogininfor(username, Constants.LOGIN_FAIL, e.getMessage())
(方法的返回值是TimerTask类型)作为参数传入AsyncManager.me().execute()方法,
我们查看到AsyncFactory.recordLogininfor方法的返回值为TimerTask类型,这里返回了一个TimerTask()的匿名内部类,且重写了run接口,将需要执行的任务放在里面就行
这里获取了LoggerFactory.getLogger("sys-user")来打印日志,可在logback.xml找到相关配置
2、threadPoolTaskExecutor的使用
我们可以结合@EnableAsync和@Async来使用该线程池
首先,往原来定义好的线程池加入两行代码
然后定义自己的异步工厂,注意添加两个注解
其中@Async("threadPoolTaskExecutor")的参数为上面定义的线程池@Bean(name = "threadPoolTaskExecutor"),
需要执行什么任务就添加几个对应方法就行
现在我们在登录接口注入该工厂并且调用方法testThreadPoolTaskExecutor()。
进行登录,查看日志
测试通过😃