Spring Task 定时器不执行 多线程的问题

1年前 (2017-08-15) wang JAVA, 技术杂谈 0评论 已收录 454℃ 浏览数:180

最近这个项目中,之前写的一个价格计算的类,配置在spring-task.xml中。之前订单的实时价格计算的没有任何的问题。但是这几天突然发现订单的价格没有执行了。调试以后发现是整个定时器没有被调用。但是在项目启动的时候是调用了的。那么就很有意思。


    <task:scheduled-tasks>   
    
         <!-- 未结束异常在线订单处理-->
         <task:scheduled ref="usualOrderTask" method="serachUsualOrder" cron="0 2/3 * * * ?"/>
         <!-- 长时间未接单在线订单处理-->
         <task:scheduled ref="usualOrderTask" method="serachUntreatedOrder" cron="0 2/2 * * * ?"/>
         <!-- 实时订单价格计算-->                                                                                           
         <task:scheduled ref="pricingCalculateTask" method="pricingCalculate" cron="*/10 * * * * ?"/>   
          
    </task:scheduled-tasks>  

初步考虑,是否是由于执行一次该类的时间过长,导致一个定时器周期内不能执行完一次方法。然后自己把自己阻塞了?然后我在该类的最上方和最下面打印了当前的时间戳。但是发现运行的时间在一秒内。

执行开始2017-08-15 15:40:57
执行结束2017-08-15 15:40:57
执行开始2017-08-15 15:41:00
执行结束2017-08-15 15:41:00

那说明不是这个问题,那是什么问题呢?

然后查看控制台的日志。

执行结束2017-08-15 15:40:57
执行开始2017-08-15 15:41:00
执行结束2017-08-15 15:41:00
[UsualOrderTask] - 异常未结束订单循环超时时间----59$$$$$$$$$$$$$$$$$$$$$$$查询在线异常订单信息 --- serachUsualOrder$$$$$$$$$$$$$$$$$$$$$$$0

然后就没有输出了。这是什么问题。在网上查了一下。结果最终知道了为什么这样子。

是因为 spring 定时器任务scheduled-tasks默认配置是单线程串行执行的 项目中spring-task中配置了三个定时器。最开始剩下两个没有执行,只执行了订单价格计算的定时器。所以会一直打印log。然后在剩下两个条件被触发的时候,那两个任务执行非常频繁,导致订单价格计算的定时器一直被阻塞了。


    <task:scheduler id="scheduler" pool-size="3" />
	<task:scheduled-tasks scheduler="scheduler" >   
    
         <!-- 未结束异常在线订单处理-->
         <task:scheduled ref="usualOrderTask" method="serachUsualOrder" cron="0 2/3 * * * ?"/>
         <!-- 长时间未接单在线订单处理-->
         <task:scheduled ref="usualOrderTask" method="serachUntreatedOrder" cron="0 2/2 * * * ?"/>
         <!-- 实时订单价格计算-->                                                                                           
         <task:scheduled ref="pricingCalculateTask" method="pricingCalculate" cron="*/10 * * * * ?"/>   
          
    </task:scheduled-tasks>  

将task配置为三个线程,这样每个定时器由一个子线程去执行。就不会出现阻塞了~

参考文章 http://blog.csdn.net/loongshawn/article/details/50663393

博主

Just do it. Now or never.

相关推荐

嗨、骚年、快来消灭0回复。