Quartz——有状态的job和无状态的job

          如果使用了Quartz,当然在一个系统中绝不仅仅是一个job那么简单,如果同一个job同一时刻运行,可能会造成重复入库的情况。所以我们希望多线程时,能够控制同一时刻相同job只能有一个正在执行。

          有时候job执行频率很小,然后在这么短的时间内该job还没结束,结果另一线程再次启用同一job下的方法,这样可能会造成重复的情况,希望在前一个此job结束后再进行下一次调用。

          其实据说很简单,就是在detail的参数里加上一句话就行了,把这个job设置成有状态的job

记得有一个问题,也是同样的情况,当相同的job来了前一个job还没执行完,可不可以让没执行完的job强制关闭执行当前job

<span style="font-size:18px;"><property name="concurrent" value="false" /> <---<span style="font-family: 微软雅黑; font-size: 16px;">指定最终封装出的任务是否有状态</span>-></span>

 定时任务测试

<span style="font-size:18px;"><!--定时任务测试-->
<bean id="firstTestImpl" class="com.nonobank.app.invite.service.impl.InviteCodesServiceImpl"></bean>
<bean id="firstQuartzJob" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
	<!--指定要定时执行的方法所在类,将定时任务定义成bean--> 
	<property name="targetObject" ref="firstTestImpl"></property>
	<!--指定定时执行的方法--> 
	<property name="targetMethod" value="myTestQuartzFirst"></property>
	<!--指定目标封装为有状态的任务,有状态的任务不能并发执行,无状态的任务可并发执行-->
	<property name="concurrent"> <value>false</value> </property> 
</bean></span>

          通过concurrent属性指定任务的类型,默认情况下封装为无状态的任务,如果希望目标封装为有状态的任务,仅需要将concurrent设置为false就可以了。

          Spring通过名为concurrent的属性指定任务的类型,能够更直接地描述到任务执行的方式(有状态的任务不能并发执行,无状态的任务可并发执行),对于不熟悉Quartz内部机制的用户来说,比起statefule,concurrent显然更简明达意些。

 

关于有状态JOB(StatefulJob)

 

          网上有很多关于有状态JOB的作用与使用的文章,我借鉴下,做下简单的说明:

a).实现有状态JOB只需要实现org.quartz.StatefulJob 接口即可,StatefulJob 接口仅仅是扩展了 Job接口,未加入新的方法.

 

b).Job(无状态)和 StatefulJob 在框架中使用中存在两个关键差异。首先,JobDataMap 在每次执行之后重新持久化到JobStore 中。这样就确保你对Job 数据的改变直到下次执行仍然保持着。你可以在有状态  Job 中简单的通过 map 的 put()方法来修改 JobDataMap.已存在的任何数据会被新的数据覆盖掉。你也能对无状态的 Job 这么做,但是因为对于无状态 Job来说,JobDataMap 不会持久化,所以数据不会保存下来。  

     

c).  两个或多个有状态的 JobDetail 实例不能并发执行。说的是你创建并注册了一个有状态 JobDetail 到Scheduler 上。你还建立了两个 Trigger 来触发这个 Job:一个每五分钟触发,另一个也是每五分钏触发。假如这两个 Trigger试图在同一时刻触发  Job,框架是不允许这种事情发生的。第二个 Trigger 一直会被阻塞直到第一个结束。

 

注意:

          在使用quartz1.6版本的时候,我碰到过比较麻烦的问题,后来在iteye和csdn求助都没有解决.还是从国外的文章上找到了一些眉目解决了.

          在实现SteafulJob接口后,该JOB怎么搞都只执行一次.


  • 5
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值