【问题标题】:Quartz Scheduler - trigger does not reference given jobQuartz Scheduler - 触发器不引用给定的作业
【发布时间】:2014-09-17 16:13:43
【问题描述】:

我在我的应用程序中使用 Quartz 调度程序,但出现异常:触发器没有引用给定的作业...

查看我的代码,我似乎看不出问题出在哪里。

    var schedFact = new StdSchedulerFactory();

    scheduler = schedFact.GetScheduler();

    IJobDetail dailyJob = JobBuilder.Create<PushElectricityPricesJob>()
        .WithIdentity("dailyJob", "group1")
        .Build();

    ITrigger trigger1 = TriggerBuilder.Create()
       .WithIdentity("dailyJobTrigger", "group1")
       .StartNow()
       .WithSchedule(CronScheduleBuilder.DailyAtHourAndMinute(3, 0))
       .ForJob("dailyJob")
       .Build();

    scheduler.ScheduleJob(dailyJob, trigger1);

    IJobDetail monthlyJob = JobBuilder.Create<PushContributionsJob>()
        .WithIdentity("monthlyJob", "group2")
        .Build();

    ITrigger trigger2 = TriggerBuilder.Create()
        .WithIdentity("monthlyJobTrigger", "group2")
        .StartNow()
        .WithSchedule(CronScheduleBuilder.MonthlyOnDayAndHourAndMinute(1, 0, 0))             
        .ForJob("monthlyJob")
        .Build();

    scheduler.ScheduleJob(monthlyJob, trigger2);

    scheduler.Start();

我确实在 StackOverflow 上找到了很多类似这样的帖子,但在每个帖子上我都能发现开发人员犯的错误或拼写错误。在这里,我只是一无所知..

有什么想法吗?

【问题讨论】:

  • 您是否对两个触发器或只是其中一个或另一个获得相同的异常?
  • 我一次尝试了一个(当然两个都试过了),结果和两个都失败了

标签: .net quartz-scheduler


【解决方案1】:

好的,找到了!

问题在于组。 WithIdentity 方法可以在不指定组的情况下调用,只需使用名称即可。

这样就变成了:

IJobDetail dailyJob = JobBuilder.Create<PushElectricityPricesJob>()
    .WithIdentity("dailyJob")
    .Build();

ITrigger trigger1 = TriggerBuilder.Create()
   .WithIdentity("dailyJobTrigger")
   .StartNow()
   .WithSchedule(CronScheduleBuilder.DailyAtHourAndMinute(3, 0))
   .ForJob("dailyJob")
   .Build();

这似乎工作正常。 当然,你需要为其他工作做同样的事情。

【讨论】:

    【解决方案2】:

    删除 .ForJob("dailyJob")

    或者换成其他的

    【讨论】:

    • 请添加一些解释以使答案对其他人也有用
    【解决方案3】:

    在 trigger.forJob("job01", "group1") 上使用与 jobDetail.withIdentity("job01", "group1") 相同的组

    需要告知触发器您的作业正在使用哪个组,例如:

        var schedFact = new StdSchedulerFactory();
    
        scheduler = schedFact.GetScheduler();
    
        IJobDetail dailyJob = JobBuilder.Create<PushElectricityPricesJob>()
            .WithIdentity("dailyJob", "group1")
            .Build();
    
        ITrigger trigger1 = TriggerBuilder.Create()
           .WithIdentity("dailyJobTrigger", "group1")
           .StartNow()
           .WithSchedule(CronScheduleBuilder.DailyAtHourAndMinute(3, 0))
           .ForJob("dailyJob", "group1")
           .Build();
    
        scheduler.ScheduleJob(dailyJob, trigger1);
    

    除此之外,它会认为它使用 DEFAULT 组并且将不起作用。

    【讨论】:

    • 根据代码编辑您的答案以包含示例可能会有所帮助。如果我理解正确,您的意思是他们应该将“.ForJob("dailyJob")”替换为“.ForJob("dailyJob, group1")”并为monthlyJob 做类似的事情?
    【解决方案4】:

    错误基本上意味着:JobDetail 中定义的JobKeyTrigger 中定义的JobKey 不匹配。所以,制作:

    JobBuilder.withIdentity(JobKey.jobKey("ABC")) 
    TriggerBuilder.withIdentity(JobKey.jobKey("ABC")) 
    

    显然,您还必须使两个组名相同;或删除两者

    【讨论】:

      猜你喜欢
      • 2020-08-30
      • 1970-01-01
      • 2017-07-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多