当前位置: 首页 > 知识库问答 >
问题:

Spring计划器/执行者的AOP特性

章哲彦
2023-03-14

我一直在处理一个旧的项目,其中启用了Spring调度程序(@Sched我市正在积极使用),也激活了一些本地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"/>

一些quartz实现产生于它自己的作业定义,触发器定义,其中作业定义了它们自己的线程池执行器,如下所示,

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

然后开始将任务(Runnable)提交到池中。

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

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

2021-06-21 11:51:58,679错误[pool-151-thread-81]LisJobHandler-异常发生:执行者[java.util.concurrent.ThreadPoolExecutor@5532827b[正在运行,池大小=1000,活动线程=1000,排队的任务=100000,已完成的任务=135592411]]未接受任务:org.springframework.aop.interceptor.AsyncExecttionInterceptor$1@5a237108missdn: 5363443640org.springframework.core.task.TaskReject tedExctive:执行者[java.util.concurrent.ThreadPoolExecutor@5532827b[正在运行,池大小=1000,活动线程=1000,排队的任务=100000,已完成的任务=135592411]]未接受任务:org.springframework.aop.interceptor.AsyncExecuretionInterceptor$1@5a237108

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

共有1个答案

章阳波
2023-03-14

嗯,这个问题是我最初的假设。当我在Spring调试中深入了解时,我发现队列任务提交来自我的另一个bean。它有异步任务注册,应用程序中的每个错误都会调用这个异步方法来触发一些自定义操作。因此,一旦endpoing失败,并且无法恢复,这个问题就会发生。因为当前的设计一直调用异步方法,并且每个调用都占据了执行器池中的一个位置。

 类似资料:
  • 我在java中遇到了ScheduledExecutorService的问题(几天前我没有遇到这个问题,这让我觉得很奇怪)。请找到下面的代码和控制台输出。重复执行任务之间的延迟是1毫秒,所以理想情况下我应该达到每秒1000的计数(几毫秒),但这只是没有发生。请帮帮忙.. 代码: 控制台输出 1000-2013年3月13日14:43:54.477 200-2013年3月13日14:44:10.296

  • (1)和(2)两个执行标记的不同含义是什么?

  • 我试图实现一个简单的Spring AOP(v4)示例,使用建议和一个原位切入点表达式,但是没有调用方面方法。我有所有必需的依赖关系(spring-aop、aopalliance和aspectweaver)。我做错了什么? 方面:

  • 我正在开发一个 Spring-MVC 应用程序,其中我使用调度来删除不必要的额外内容。不幸的是,我计划的方法没有触发。谁能告诉我我做错了什么。 这是代码: 我知道参数名称为1周,但我将在3天后删除它。我刚刚复制了代码…:D任何帮助都很好。谢谢

  • 主要内容:1.执行入口,2.进入拦截器责任链,3.执行顺序1.执行入口 调用了 方法 这个方法得到一个拦截器链, 是5个增强器封装成MethodInterceptor 然后 mi.proceed() 方法触发拦截器链的方法。 最后的一个方法进入了 , 进入了拦截器的责任链 2.进入拦截器责任链 ReflectiveMethodInvocation.proceed() -> ExposeInvocationInterceptor.invoke(mi) ->

  • 嗨,我正在使用Spring AOP进行日志记录,我有以下两个方面@before和@afterreturn,不幸的是,这两个方面都打印相同的响应,这里的期望是@before打印方法输入和@afterreturning打印方法输出。