一、问题
"Unexpected error occurred in scheduled task.↵org.springframework.core.task.TaskRejectedException: Executor [java.util.concurrent.ThreadPoolExecutor@41fbf07a[Running, pool size = 40, active threads = 40, queued tasks = 12, completed tasks = 632957]] did not accept task: org.springframework.aop.interceptor.AsyncExecutionInterceptor$$Lambda$729/1676075365@169b451c↵ at org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor.submit(ThreadPoolTaskExecutor.java:344)↵ at org.springframework.aop.interceptor.AsyncExecutionAspectSupport.doSubmit(AsyncExecutionAspectSupport.java:284)↵ at org.springframework.aop.interceptor.AsyncExecutionInterceptor.invoke(AsyncExecutionInterceptor.java:129)↵ at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:185)↵ at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:212)↵ at com.sun.proxy.$Proxy127.saveInAndOutMessage(Unknown Source)↵ at com.ovopark.service.impl.TaskServiceImpl.licencePlateDeviceOffLine(TaskServiceImpl.java:69)↵ at com.ovopark.job.ScheduleJob.plateDeviceOfflineJob(ScheduleJob.java:32)↵ at sun.reflect.GeneratedMethodAccessor807.invoke(Unknown Source)↵ at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)↵ at java.lang.reflect.Method.invoke(Method.java:498)↵ at org.springframework.scheduling.support.ScheduledMethodRunnable.run(ScheduledMethodRunnable.java:84)↵ at org.springframework.scheduling.support.DelegatingErrorHandlingRunnable.run(DelegatingErrorHandlingRunnable.java:54)↵ at org.springframework.scheduling.concurrent.ReschedulingRunnable.run(ReschedulingRunnable.java:93)↵ at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)↵ at java.util.concurrent.FutureTask.run(FutureTask.java:266)↵ at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:180)↵ at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:293)↵ at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)↵ at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)↵ at java.lang.Thread.run(Thread.java:748)↵Caused by: java.util.concurrent.RejectedExecutionException: Task java.util.concurrent.FutureTask@58f98d07 rejected from java.util.concurrent.ThreadPoolExecutor@41fbf07a[Running, pool size = 40, active threads = 40, queued tasks = 12, completed tasks = 632957]↵ at java.util.concurrent.ThreadPoolExecutor$AbortPolicy.rejectedExecution(ThreadPoolExecutor.java:2063)↵ at java.util.concurrent.ThreadPoolExecutor.reject(ThreadPoolExecutor.java:830)↵ at java.util.concurrent.ThreadPoolExecutor.execute(ThreadPoolExecutor.java:1379)↵ at java.util.concurrent.AbstractExecutorService.submit(AbstractExecutorService.java:134)↵ at org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor.submit(ThreadPoolTaskExecutor.java:341)↵ ... 20 more"
二、现象
package com.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
import java.util.concurrent.Executor;
/**
* 线程池配置类
*
* @author
*/
@Configuration
@EnableAsync
public class ThreadPoolConfig {
@Bean("getExecutor")
public Executor getExecutor() {
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
//设置核心线程数
executor.setCorePoolSize(5);
//设置最大线程数
executor.setMaxPoolSize(40);
//队列容量
executor.setQueueCapacity(12);
//设置线程名
executor.setThreadNamePrefix("池内异步工作线程---");
//设置多余线程等待的时间,单位:秒,Default is 60
executor.setKeepAliveSeconds(10);
// 初始化线程
executor.initialize();
// 设置拒绝策略
//executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
// 等待所有任务结束后再关闭线程池
//executor.setWaitForTasksToCompleteOnShutdown(true);
return executor;
}
}
三、原因
因为设置了默认拒绝策略AbortPolicy,直接抛出了异常
四、解决办法
package com.config;
import java.util.concurrent.ThreadPoolExecutor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
import java.util.concurrent.Executor;
/**
* 线程池配置类
*
* @author
*/
@Configuration
@EnableAsync
public class ThreadPoolConfig {
@Bean("getExecutor")
public Executor getExecutor() {
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
//设置核心线程数
executor.setCorePoolSize(5);
//设置最大线程数
executor.setMaxPoolSize(40);
//队列容量
executor.setQueueCapacity(12);
//设置线程名
executor.setThreadNamePrefix("async-service-");
//设置多余线程等待的时间,单位:秒,Default is 60
executor.setKeepAliveSeconds(10);
// 初始化线程
executor.initialize();
// 设置拒绝策略
// rejection-policy:当pool已经达到max size的时候,如何处理新任务
// CALLER_RUNS:不在新线程中执行任务,而是有调用者所在的线程来执行
executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
// 等待所有任务结束后再关闭线程池
//executor.setWaitForTasksToCompleteOnShutdown(true);
return executor;
}
}