SpringBoot自定义线程池异步执行任务
SpringBoot自定义线程池异步执行任务
@EnableAsync //开启异步 @Configuration public class MyAsyncConfigurer implements AsyncConfigurer { /** 线程池拒绝策略 * 1. AbortPolicy * 当任务添加到线程池中被拒绝时,它将抛出 RejectedExecutionException 异常。 * (该策略下,直接丢弃任务,并抛出RejectedExecutionException异常) * 2. CallerRunsPolicy * 不进入线程池执行,在这种方式(CallerRunsPolicy)中,任务将由调用者线程去执行。 * (用于被拒绝任务的处理程序,它直接在execute 法的调用线程中运行被拒绝的任务;如果执行程序已关闭,则会丢弃该任务.) * 3. DiscardPolicy * 当任务添加到线程池中被拒绝时,默认情况下它将丢弃被拒绝的任务。 * (即该策略下,直接丢弃任务,什么都不做) * 4. DiscardOldestPolicy * 当任务添加到线程池中被拒绝时,线程池会放弃等待队列中最旧的未处理任务,然后将被拒绝的任务添加到等待队列中。 * (该策略下,抛弃进入队列最早的那个任务,然后尝试把这次拒绝的任务放入队列) * @return */ //自定义线程池 @Override public Executor getAsyncExecutor() { ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); //核心线程 executor.setCorePoolSize(10); //最大线程 executor.setMaxPoolSize(20); //队列大小 executor.setQueueCapacity(Integer.MAX_VALUE); //线程活跃时间,默认60秒 //executor.setKeepAliveSeconds(); //设置线程之间的threadlocal相互传递的方式,自定义一个类去实现TaskDecorator接口 //executor.setTaskDecorator(MyTaskDecorator); //所有任务结束后关闭线程池 //executor.setWaitForTasksToCompleteOnShutdown(true); //设置拒绝策略rejectedExecutionHandler executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy()); //设置线程名称前缀 executor.setThreadNamePrefix("myTaskExecutor-"); executor.initialize(); return executor; } /** * 自定义线程全局异常处理 * @return */ @Override public AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() { return new MyAsyncExceptionHandler(); } }
@Slf4j public class MyAsyncExceptionHandler implements AsyncUncaughtExceptionHandler { @Override public void handleUncaughtException(Throwable throwable, Method method, Object... objects) { log.info("------全局线程池异常处理-----"); log.info("------error fillInStackTrace:" + throwable.fillInStackTrace()); log.info("------error message:" + throwable.getMessage()); log.info("------error methodName:" + method.getName()); for (Object param : objects) { log.info("------param:" + param); } } }
//静态异步任务 // @Scheduled默认时单线程 @Component public class MyTask { @Scheduled(cron = "0/5 * * * * ?") @Async //异步任务 public void task1() { System.out.println("------静态定时任务1" + Thread.currentThread().getId() + "------" + Thread.currentThread().getName() + "调度:" + LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"))); } @Scheduled(cron = "0/10 * * * * ?") @Async public void task2() { System.out.println("------静态定时任务2" + Thread.currentThread().getId() + "------" + Thread.currentThread().getName() + "调度:" + LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"))); } }
下一篇:
Java | ArrayList用法总结