【问题标题】:Quartz SimpleTrigger not firingQuartz SimpleTrigger 不触发
【发布时间】:2014-11-05 17:11:44
【问题描述】:

我正在为 Quartz 的触发器而苦苦挣扎。我创建了一个通过 cron 表达式调用的服务,但它本身也是一个 org.quartz.Job,其背后的想法是,一旦调用该服务,我会检查一些变量并基于这些变量我决定延迟(或不延迟) ) 执行服务 1 天;为此,我得到DefaultScheduler,创建一个新的org.quartz.JobDetail 和一个org.quartz.SimpleTrigger,并安排它们。正如您可能猜到的那样,它不起作用,新的触发器永远不会启动。

public class MyService implements MyInterface, org.quartz.Job {

    @Override
    //method declared in MyInterface
    public void generateFile() {
        org.quartz.Scheduler scheduler;
        try {
            scheduler = org.quartz.impl.StdSchedulerFactory.getDefaultScheduler();
        } catch (SchedulerException e1) {
            scheduler = null;
        }
        if (condition) {
            //regular processing
        } else {
            try {  
                    org.quartz.JobDetail jobDetail;
                    SimpleTrigger simpleTrigger;
                    String name = "jobName";
                    if (scheduler != null && scheduler.isInStandbyMode()){
                        jobDetail = new org.quartz.JobDetail(name, org.quartz.Scheduler.DEFAULT_GROUP, MyService.class);  
                        jobDetail.getJobDataMap().put("myService", this);                       
                        Calendar c = Calendar.getInstance();
                        int date = c.get(Calendar.DATE);
                        c.set(Calendar.DATE, date + 1);
                        simpleTrigger = new SimpleTrigger("simpleTrig", c.getTime());
                        simpleTrigger.setJobName(name);

                        jobDetail.setDurability(true);
                        scheduler.addJob(jobDetail, true);

                        scheduler.scheduleJob(simpleTrigger);
                        //also tested with 
                        //scheduler.scheduleJob(jobDetail, simpleTrigger);
                        //and same result
                        scheduler.start();
                    }
                    else{
                        scheduler.shutdown();
                    }
                } catch (java.text.ParseException e) {  
                } 
                catch (org.quartz.SchedulerException ex) {  
                }
        }
    }

    @Override
    public void execute(JobExecutionContext jobContext) throws JobExecutionException {
        MyInterface jobParamLogService = (MyInterface)jobContext.getJobDetail().getJobDataMap().get("myService");
        jobParamLogService.generateFile();
    }

正如我所说,我的问题是 SimpleTrigger 永远不会被调用(当然,我已经测试了添加几分钟,而不是一天),有没有关于发生了什么的提示?
任何帮助将不胜感激。

【问题讨论】:

  • 您应该做的第一件事是正确处理您的异常。由于问题,您可能不会将作业添加到调度程序。记录消息/堆栈跟踪或某些非常重要的东西
  • 嗨@ChrisHinshaw,感谢您的评论,我向您展示的代码只是一个简化版本,我正在处理异常,但没有抛出任何异常
  • 这里有两件事:1)你到底为什么要以如此复杂的方式查找你的服务实例,而可以直接调用this.generateFile()(省略this.是一样的)2)为什么您使用对默认调度程序的静态调用,而您可以直接从提供给您的作业的 JobExecutionContext 访问实际调度程序?我的猜测是您的条件实际上是错误的,或者您访问了错误的调度程序,最终确实没有发生任何事情。
  • 嗨@GuillaumePolet,感谢您的评论。关于第一个问题,可能你是对的,我没有意识到我可以打电话给generateFile(),我不假思索地遵循了一个例子......关于你的第二个观察,我不知道 JobExecutionContext,但我认为这不是问题,实际上当我得到调度程序时,它是正确的,它包含作业和触发器
  • 你为什么要测试isInStandByMode()?由于您处于正在运行的作业中,因此这很可能总是错误的。先去掉那张支票。

标签: java triggers cron quartz-scheduler


【解决方案1】:

正如@GuillaumePolet 建议的那样,我尝试删除isInStandByMode 条件,但仍然没有用。诀窍是用默认参数(空)替换构造函数,并通过 setter 方法设置变量。
谢谢大家的帮助,亲切的问候

【讨论】:

  • 旧帖,但我仍会尝试;你的意思是你确实通过simpleTrigger = new SimpleTrigger() 解决了这个问题,然后使用了setter?我遇到了同样的问题,我无法正确启动延迟触发器-它要么立即启动,要么根本不启动..:/
  • 嗨@Jokkeri,这是一个非常古老的帖子,我什至不记得我为什么要这样做,但根据我的评论,问题似乎是带有参数的构造函数跨度>
  • 其实我终于弄清楚了我的问题...这是一个相当复杂的场景,实际问题在于作业的命名和其中的一些并发性...延迟的启动请求在 ~1s 后被删除在我的代码中,因此从未被解雇 - 我自己的坏 =)
猜你喜欢
  • 1970-01-01
  • 2016-03-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-25
  • 2011-11-15
  • 1970-01-01
相关资源
最近更新 更多