zoukankan      html  css  js  c++  java
  • Quartz(任务调度)- job串行避免死锁

    参照:http://blog.csdn.net/haitaofeiyang/article/details/50737644

    quartz框架中防止任务并行可以有两种方案:

     
    1、如果是通过MethodInvokingJobDetailFactoryBean在运行中动态生成的Job,配置的xml文件有个concurrent属性,这个属性的功能是配置此job是否可以并行运行,如果为false则表示不可以并行运行,否则可以并行。如果一个job的业务处理发费的时间超过了job的启动的间隔时间(repeatInterval),这个属性非常有用。如果为false,那么,在这种情况下,当前job还在运行,那么下一个job只能延时运行。如果为true,那么job就会并行运行。
     
    <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(有状态的),此时的任务也就会串行执行了。
     
    public class BackCoupon implements StatefulJob {
    
        @Override
        public void execute(JobExecutionContext context)
                  throws JobExecutionException {
    
        }
    
    }

    在Quartz中:

    如果实现org.quartz.Job接口,那么这个job是stateless的,job实例的参数不能在多个任务之间共享

    如果实现org.quartz.StatefulJob,这个job是个单例的,job实例的属性可以从当前任务传递到下一个任务。

    作者:枫红一叶
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
  • 相关阅读:
    第四次作业——个人作业——软件案例分析
    作业五——团队项目——需求规格说明书
    团队项目——团队展示
    作业三——结对编程
    作业二——结对项目之需求分析与原型模型设计
    leetcode 212 单词搜索II
    leetcode 130. 被围绕的区域
    leetcode 695 Max Area of Island 岛的最大面积
    【《算法》学习笔记】一:
    leetcode 191 位1的个数
  • 原文地址:https://www.cnblogs.com/peak-c/p/5418096.html
Copyright © 2011-2022 走看看