AOP features of Spring Scheduler/Executor



我一直在做一个旧项目,其中启用了Spring调度器(@Scheduled正在使用中(,也启用了一些本地JDK线程池实例。在我下面看到的项目配置xml中;

<task:scheduler id="taskScheduler" pool-size="${task-scheduler.pool-size}"/>
<task:executor id="taskExecutor" pool-size="${task-executor.pool-size}" queue-capacity="${task-executor.queue-capacity}"/>
<task:annotation-driven executor="taskExecutor" scheduler="taskScheduler"/>

他们的一些石英实现产生了自己的作业定义,触发定义的东西,其中作业定义了自己的线程池执行器,如下所示,

BlockingQueue<Runnable> workerTaskQueue = new ArrayBlockingQueue<Runnable>(poolSize*3);
threadPoolExecutor = new 
ThreadPoolExecutor(poolSize,poolSize,1000L,TimeUnit.MILLISECONDS,workerTaskQueue);

然后开始向池中提交任务(Runnables(。

threadPoolExecutor.execute(new ImcpWorker(task, this, workerTaskUtil));

但我看到的是,在某个时刻,为这些任务抛出了Spring任务拒绝异常。这是无稽之谈(除非Spring使用AOP拦截线程池执行器,即使它们是本地创建的(。因为没有弹簧管理的执行器。

2021-06-21 11:51:58679错误[pool-151-thread-81]LisJobHandler-发生异常:执行程序[java.util.concurrent.ThreadPoolExecutor@5532827b[跑步,游泳池大小=1000,活动线程=1000,排队任务=100000,已完成任务=135592411]]未接受任务:org.springframework.aop.intercept.AsyncExecutionInterceptor$1@5a23708msisdn:55363443640 org.springframework.core.task.TaskRejectedException:执行人[java.util.concurrent.ThreadPoolExecutor@5532827b[跑步,池大小=1000,活动线程=1000,排队任务=100000,已完成的任务=135592411]]未接受任务:org.springframework.aop.intercept.AsyncExecutionInterceptor$1@5a23708

那么问题又来了,spring调度器和执行器(如果配置的话(是否会拦截应用程序中的ThreadPoolExecutors?

这个问题与我最初的假设无关。随着春季调试的深入,我看到队列任务提交来自我的另一个bean。它有异步任务注册,应用程序中的每个错误都调用这个异步方法来触发一些自定义操作。因此,一旦一个结束操作失败得很厉害,无法恢复,就会出现这个问题。因为当前的设计一直在调用异步方法,并且每个调用都占用执行器池中的一个插槽。

最新更新