同一个Job Quartz.Net的多个触发器

Waq*_*med 8 quartz.net

我有以下代码:

 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);
Run Code Online (Sandbox Code Playgroud)

我收到以下异常:

Quartz.dll中发生了未处理的"Quartz.ObjectAlreadyExistsException"类型异常

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

但我被告知你可以拥有同一个JOB的多个触发器.也许我做错了什么?

gra*_*der 18

将作业添加到计划程序.

然后在创建触发器时使用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();
Run Code Online (Sandbox Code Playgroud)

  • 对于不同的参数,请参阅 ".UsingJobData("JobDetailParameter001", "Abcd1234")(用于作业设置),然后用于读取值: public virtual void Execute(IJobExecutionContext context) { JobDataMap mergeMap = context.MergedJobDataMap; string myValue = mergeMap.GetString("JobDetailParameter001"); 对于非当前,研究 [DisallowConcurrentExecution] 属性 (2认同)