具体错误信息如下:
2022-01-25 00:00:00.094 [SockJS-3] ERROR o.s.s.support.TaskUtils$LoggingErrorHandler - Unexpected error occurred in scheduled task.
org.springframework.core.task.TaskRejectedException: Executor [java.util.concurrent.ThreadPoolExecutor@3c5e6177[Running, pool size = 200, active threads = 200, queued tasks = 10, completed tasks = 91597]] did not accept task: org.springframework.aop.interceptor.AsyncExecutionInterceptor$1@1937c85a
at org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor.submit(ThreadPoolTaskExecutor.java:323)
at org.springframework.aop.interceptor.AsyncExecutionAspectSupport.doSubmit(AsyncExecutionAspectSupport.java:280)
at org.springframework.aop.interceptor.AsyncExecutionInterceptor.invoke(AsyncExecutionInterceptor.java:130)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:673)
at com.yo.project.module.system.component.QuartzConfig$$EnhancerBySpringCGLIB$$e7c895d1.timingImplement(<generated>)
at sun.reflect.GeneratedMethodAccessor228.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at org.springframework.scheduling.support.ScheduledMethodRunnable.run(ScheduledMethodRunnable.java:65)
at org.springframework.scheduling.support.DelegatingErrorHandlingRunnable.run(DelegatingErrorHandlingRunnable.java:54)
at org.springframework.scheduling.concurrent.ReschedulingRunnable.run(ReschedulingRunnable.java:81)
at java.util.concurrent.Executors$RunnableAdapter.call(Unknown Source)
at java.util.concurrent.FutureTask.run(Unknown Source)
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(Unknown Source)
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)
有2种原因可能导致此异常:
- 线程池ThreadPoolExecutor 显示的shutdown()之后,再向线程池提交任务,如果你配置的拒绝策略是 AbortPolicy 的话,就会抛出这个异常。
- 队列满了,而且池中的线程数也达到了最大线程数,所以新添加的任务被拒绝了。
如果是队列满了:
原理分析:
- 初始时,程序中活跃的线程为 0,当程序启动后会开始创建线程
- 当活跃线程数小于核心线程数时,创建线程执行任务
- 当活跃线程数大于核心线程数是,将任务放进队列中等待执行
- 当队列满了,且活跃线程数小于最大线程数时,再创建线程执行队列中任务
- 当活跃线程数等于最大线程数时,抛出异常 RejectedExecutionException 拒绝任务
解决方案:
- 采用无界队列,也就不会出现任务满的情况了,即:把queue换成LinkedBlockingQueue,不过这种情况,你的最大线程数就没意义了,只会保持核心线程数在运行
- 增加最大线程数,并设置拒绝策略为抛弃旧的任务(new ThreadPoolExecutor.DiscardOldestPolicy())