zoukankan      html  css  js  c++  java
  • Quartz Java resuming a job excecutes it many times--转

    原文地址:http://stackoverflow.com/questions/1933676/quartz-java-resuming-a-job-excecutes-it-many-times

    Question:

    For my application i create jobs and schedule them with CronTriggers. Each job has only one trigger and both the job name and the trigger names are the same. No jobs share a trigger.

    Now when i create a cron trigger like this "0/1 * * * * ?" which instructs the job to execute every second, it works just fine.

    The problem rises when i first pause the job by calling :

    scheduler.pauseJob(jobName, jobGroup);
    

    and then resuming the job after let's say 50 seconds with :

    scheduler.resumeJob(jobName, jobGroup);
    

    What i see is that for these 50 seconds the job did not execute as requested. But the moment i resume the job i see 50 executions of the job at the same time!!!

    I thought that this was due to the default setting for the misfire instruction but even after setting the trigger's misfire instruciton upon creation to this :

    trigger.setMisfireInstruction(CronTrigger.MISFIRE_INSTRUCTION_DO_NOTHING);
    

    The same thing happens. Can anyone suggest a way to fix this?

    answer:

    The CronTrigger works by remembering the nextFireTime. After creating the trigger the nextFireTime is initialized. Every time the job is triggered nextFireTime is updated. Since the job is not triggered when paused nextFireTime remains "old". So after you resume the job the trigger will return every old trigger time.

    The problem is, the trigger doesn't know it is being paused. To overcome this there is this misfire handling. After resuming the jobs the trigger's updateAfterMisfire() method will be invoked which corrects the nextFireTime. But not if the difference between nextFireTime and now is smaller than the misfireThreshold. Then the method is never called. This threshold's default value is 60,000. Thus if your pause period would be longer than 60s everything would be fine.

    Since you have problems I assume it is not. ;) To workaround this you can modify the threshold or use a simple wrapper around CronTrigger:

    public class PauseAwareCronTrigger extends CronTrigger {
        // constructors you need go here
    
        @Override
        public Date getNextFireTime() {
            Date nextFireTime = super.getNextFireTime();
            if (nextFireTime.getTime() < System.currentTimeMillis()) {
                // next fire time after now
                nextFireTime = super.getFireTimeAfter(null);
                super.setNextFireTime(nextFireTime);
            }
            return nextFireTime;
        }
    }
  • 相关阅读:
    golang 简单的实现内 网 穿 透,用户访问本地服务。
    golang 创建一个简单的广播echo服务器
    golang 使用 protobuf 的教程
    golang语言中os包的学习与使用(文件,目录,进程的操作)
    【原】画流程图工具visio使用技巧汇总
    【改】IOS-百度地图API用点生成线路、导航、自定义标注 2013年11月更新
    【原】xcode5&IOS7及以下版本免证书真机调试记录
    【转】C++的拷贝构造函数深度解读,值得一看
    【转】c++中引用的全方位解读
    【转】self.myOutlet=nil、viewDidUnload、dealloc的本质剖析
  • 原文地址:https://www.cnblogs.com/davidwang456/p/5482858.html
Copyright © 2011-2022 走看看