补习系列(9)-springboot 定时器,你用对了吗 (2)

代码如下:

@Configuration @EnableScheduling public class ScheduleConfig implements SchedulingConfigurer { @Override public void configureTasks(ScheduledTaskRegistrar taskRegistrar) { taskRegistrar.setScheduler(taskExecutor()); } @Bean(destroyMethod="shutdown") public Executor taskExecutor() { //线程池大小 return Executors.newScheduledThreadPool(50); } } 四、@Async

@Async 注解的意义在于将 Bean方法的执行方式改为异步方式。
比如 在前端请求处理时,能通过异步执行提前返回结果。

类似的,该注解需要配合 @EnableAsync 注解使用。

代码如下:

@Configuration @EnableAsync public static class ScheduleConfig { }

使用 @Async 实现模拟任务

@Component public class AsyncTimer implements CommandLineRunner { private static final Logger logger = LoggerFactory.getLogger(AsyncTimer.class); @Autowired private AsyncTask task; @Override public void run(String... args) throws Exception { long t1 = System.currentTimeMillis(); task.doAsyncWork(); long t2 = System.currentTimeMillis(); logger.info("async timer execute in {} ms", t2 - t1); } @Component public static class AsyncTask { private static final Logger logger = LoggerFactory.getLogger(AsyncTask.class); @Async public void doAsyncWork() { long t1 = System.currentTimeMillis(); try { Thread.sleep((long) (Math.random() * 5000)); } catch (InterruptedException e) { } long t2 = System.currentTimeMillis(); logger.info("async task execute in {} ms", t2 - t1); } }

示例代码中,AsyncTask 等待一段随机时间后结束。
而 AsyncTimer 执行了 task.doAsyncWork,将提前返回。

执行结果如下:

- async timer execute in 2 ms - async task execute in 3154 ms

这里需要注意一点,异步的实现,其实是通过 Spring 的 AOP 能力实现的。
对于 AsyncTask 内部方法间的调用却无法达到效果。

定制 @Async 线程池

对于 @Async 线程池的定制需使用 AsyncConfigurer接口。

代码如下:

@Configuration @EnableAsync public static class ScheduleConfig implements AsyncConfigurer { @Bean public ThreadPoolTaskScheduler taskScheduler() { ThreadPoolTaskScheduler scheduler = new ThreadPoolTaskScheduler(); //线程池大小 scheduler.setPoolSize(60); scheduler.setThreadNamePrefix("AsyncTask-"); scheduler.setAwaitTerminationSeconds(60); scheduler.setWaitForTasksToCompleteOnShutdown(true); return scheduler; } @Override public Executor getAsyncExecutor() { return taskScheduler(); } @Override public AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() { return null; } } 小结

定时异步任务是应用程序通用的诉求,本文收集了几种常见的实现方法。
作为 SpringBoot 应用来说,使用注解是最为便捷的。
在这里我们对 @Scheduled、@Async 几个常用的注解进行了说明,
并提供定制其线程池的方法,希望对读者能有一定帮助。

欢迎继续关注"美码师的补习系列-springboot篇" ,如果觉得老司机的文章还不赖,请多多分享转发^-^

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zywszw.html