我设置了一个定时任务,每天晚上7点执行,但是有可能到第二天7点的时候,任务还没执行完,这时候我想跳过这次定时任务,等到第三天7点的时候在执行。
请问配置concurrent能否实现?
或者有什么其他方法呢?
![](https://profile-avatar.csdnimg.cn/default.jpg!4)
quartz定时任务并发问题
- 写回答
- 好问题 0 提建议
- 追加酬金
- 关注问题
- 邀请回答
-
2条回答 默认 最新
- newersky 2017-12-15 03:22关注
quartz框架中防止任务并行可以有两种方案:
1、如果是通过MethodInvokingJobDetailFactoryBean在运行中动态生成的Job,配置的xml文件有个concurrent属性,这个属性的功能是配置此job是否可以并行运行,如果为false则表示不可以并行运行,否则可以并行。如果一个job的业务处理发费的时间超过了job的启动的间隔时间(repeatInterval),这个属性非常有用。如果为false,那么,在这种情况下,当前job还在运行,那么下一个job只能延时运行。如果为true,那么job就会并行运行。
[java] view plain copy<bean id=" jobCompareB2cAndLocal" class="com.vipshop.management.util.quartz.MethodInvokingJobDetailFactoryBean "> <property name="targetObject " ref="delegateJob " /> <property name="targetMethod " value="方法名" /> <property name="concurrent " value="false "></property > </bean >
2、如果是通过自定义要执行的任务的类的名称实现job的话,则有另一种方式:
默认的任务的类实现org.quartz.Job接口,此时任务是stateless(无状态的),即会出现并行的情况,那么如何避免这种情况发生呢?
解决方案:使QuartzJobBean类实现org.quartz.StatefulJob接口即可(StatefulJob接口仅仅是扩展了 Job 接口,未加入新的方法,可以不需实现Job接口了),那么此时任务就会变成stateful(有状态的),此时的任务也就会串行执行了。
[java] view plain copypublic class BackCoupon implements StatefulJob { @Override public void execute(JobExecutionContext context) throws JobExecutionException { } }
下面说明的更详细一些:
防止job并行运行的几种解决方案
一、JOB State
在通过MethodInvokingJobDetailFactoryBean在运行中动态生成的Job,配置的xml文件有个concurrent属性,表示job是否可以并行运行:如果一个job的业务处理发费的时间超过了job的启动的间隔时间(repeatInterval),这个属性非常有用。如果为false,那么,在这种情况下,当前job还在运行,那么下一个job只能延时运行。如果为true,那么job就会并行运行。在实际的应用中应该配置为true/false,要根据需要了(废话)。二、如果通过继承QuartzJobBean实现job的话,默认情况下QuartzJobBean是implements org.quartz.Job接口的,也就是说job示例是stateless的,会出现前面所述的并行情况。而代码中却要求job任务必需串行,解决办法:在job子类中继续implements org.quartz.StatefulJob。那么这个job实例变成了Stateful,job任务也就是串行的了。
注:
在Quartz中,如果实现org.quartz.Job接口,那么这个job是stateless的,job实例的参数不能在多个任务之间共享,如果实现org.quartz.StatefulJob,这个job是个单例的,job实例的属性可以从当前任务传递到下一个任务。但是我试过上面的方法后,依然看见我们的后台程序是多线程的并行执行。可能是因为在程序中,我访问框架中自己写的service层导致的,至于这个问题,我没有查出原因,所以用了一种简单粗暴的方法,在执行的service层加锁机制,具体如下:
[java] view plain copypublic class FeeService extends BaseService { public synchronized void save(){ } }
三.在业务定义静态变量,如
/**
* 任务是否正在执行标记 :false--未执行; true--正在执行; 默认未执行
*/
private static boolean isRun = false;
如果正在运行中,则不运行。本回答被题主选为最佳回答 , 对您是否有帮助呢?解决 无用评论 打赏 举报
悬赏问题
- ¥15 有偿求码,CNN+LSTM实现单通道脑电信号EEG的睡眠分期评估
- ¥15 没有证书,nginx怎么反向代理到只能接受https的公网网站
- ¥50 成都蓉城足球俱乐部小程序抢票
- ¥15 yolov7训练自己的数据集
- ¥15 esp8266与51单片机连接问题(标签-单片机|关键词-串口)(相关搜索:51单片机|单片机|测试代码)
- ¥15 电力市场出清matlab yalmip kkt 双层优化问题
- ¥30 ros小车路径规划实现不了,如何解决?(操作系统-ubuntu)
- ¥20 matlab yalmip kkt 双层优化问题
- ¥15 如何在3D高斯飞溅的渲染的场景中获得一个可控的旋转物体
- ¥88 实在没有想法,需要个思路