【问题标题】:Multiple triggers of same Job Quartz.NET同一个 Job Quartz.NET 的多个触发器
【发布时间】:2016-03-04 12:57:43
【问题描述】:

我有以下代码:

 IScheduler scheduler = StdSchedulerFactory.GetDefaultScheduler();
            scheduler.Start();
            IJobDetail job = JobBuilder.Create<EmailJob>().StoreDurably().WithIdentity("J_Email", "J_Mailing").Build();         
            ITrigger trigger = TriggerBuilder.Create()
                                .WithIdentity("MailTrigger1", "T_Mail1")
                                .StartNow()                                
                                .WithSimpleSchedule(x => x.WithMisfireHandlingInstructionIgnoreMisfires()
                                    .WithIntervalInSeconds(3)
                                    .RepeatForever())
                                .Build();       


            ITrigger triggernew = TriggerBuilder.Create()
                               .WithIdentity("MailTrigger", "T_Mail")
                               .StartNow()                               
                               .WithSimpleSchedule(x => x.WithMisfireHandlingInstructionIgnoreMisfires()
                                   .WithIntervalInSeconds(5)
                                   .RepeatForever())
                               .Build();        
            scheduler.ScheduleJob(job,triggernew);
            scheduler.ScheduleJob(job,trigger);

我收到以下异常:

“Quartz.ObjectAlreadyExistsException”类型的未处理异常 发生在 Quartz.dll 中

附加信息:无法存储作业:'J_Mailing.J_Email', 因为这个标识已经存在。

但有人告诉我,同一个 JOB 可以有多个触发器。也许我做错了什么?

【问题讨论】:

    标签: quartz.net


    【解决方案1】:

    将作业添加到调度程序。

    然后在创建触发器时,使用ForJob

    下面的代码已经过测试。

    IScheduler scheduler = StdSchedulerFactory.GetDefaultScheduler();
    
    
    //// scheduler.DeleteJob(new JobKey("J_Email"));
    
    
    IJobDetail job = JobBuilder.Create<MyConcreteJob>().StoreDurably().WithIdentity("J_Email", "J_Mailing").Build();
    
    scheduler.AddJob(job, true /* bool replace */ ); /* Add the given IJob to the Scheduler - with no associated ITrigger.  */
    
    
    ITrigger trigger = TriggerBuilder.Create()
                        .WithIdentity("MailTrigger1", "T_Mail1")
                        .StartNow()
                        .WithSimpleSchedule(x => x.WithMisfireHandlingInstructionIgnoreMisfires()
                            .WithIntervalInSeconds(3)
                            .RepeatForever())
                        .ForJob(job)
                        .Build();
    
    
    ITrigger triggernew = TriggerBuilder.Create()
                       .WithIdentity("MailTrigger", "T_Mail")
                       .StartNow()
                       .WithSimpleSchedule(x => x.WithMisfireHandlingInstructionIgnoreMisfires()
                           .WithIntervalInSeconds(5)
                           .RepeatForever())
                       .ForJob(job)
                       .Build();
    
    
    scheduler.ScheduleJob(triggernew);
    scheduler.ScheduleJob(trigger);
    
    scheduler.Start();
    

    【讨论】:

    • “ForJob”会带你到那里。
    • 谢谢 - 这非常有用。
    • Quartz.net 让我免于重新发明轮子。但是,我对上述情况有疑问,我想用不同的参数触发相同的作业。一个例子是每 5 秒我会设置一个参数 10,并且每隔一小时我会通过传递 60 来侦察一小时。但是我不希望它们的两个实例运行。我希望这是有道理的。
    • 对于不同的参数,请参阅 ".UsingJobData("JobDetailParameter001", "Abcd1234") (用于作业设置),然后 this 用于读取值: public virtual void Execute(IJobExecutionContext context) { JobDataMap mergeMap = context.MergedJobDataMap; string myValue = mergeMap.GetString("JobDetailParameter001"); 对于非当前,研究 [DisallowConcurrentExecution] 属性
    • 您还可以“注入” C# 属性 (quartz-scheduler.net/documentation/quartz-2.x/tutorial/…),这会使代码更清晰。例如。而不是 JobDataMap mergeMap = context.MergedJobDataMap;字符串 myValue = mergeMap.GetString("JobDetailParameter001");如果您定义 public string JobDetailParameter001 { private get; 您可以简单地使用“JobDetailParameter001”放; }
    猜你喜欢
    • 2018-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多