我正在使用Quartz.Net调度程序来安排我的工作。我正在使用ADOJOBSTORE来存储所有这些值。
无法存储作业:无法存储作业:'job6',因为已存在此作业标识 当我尝试运行它时抛出上述错误。有什么想法吗?
ILog log = LogManager.GetLogger(typeof(CronTrigger));
log.Info("------- Initializing -------------------");
// First we must get a reference to a scheduler
ISchedulerFactory sf = new StdSchedulerFactory();
IScheduler sched = sf.GetScheduler();
log.Info("------- Initialization Complete --------");
log.Info("------- Scheduling Jobs ----------------");
// jobs can be scheduled before sched.start() has been called
// job 6 will run every 30 seconds but only on Weekdays (Monday through Friday)
IJobDetail job = JobBuilder.Create<SimpleJob>()
.WithIdentity("job6", "group1")
.Build();
ICronTrigger trigger = (ICronTrigger)TriggerBuilder.Create()
.WithIdentity("trigger6", "group1")
.WithCronSchedule("0,30 * * ? * MON-FRI")
.Build();
DateTimeOffset ft = sched.ScheduleJob(job, trigger);
log.Info(job.Key + " has been scheduled to run at: " + ft
+ " and repeat based on expression: "
+ trigger.CronExpressionString);
log.Info("------- Starting Scheduler ----------------");
// All of the jobs have been added to the scheduler, but none of the
// jobs
// will run until the scheduler has been started
sched.Start();
log.Info("------- Started Scheduler -----------------");
//log.Info("------- Waiting five minutes... ------------");
//try
//{
// // wait five minutes to show jobs
// Thread.Sleep(300 * 1000);
// // executing...
//}
//catch (ThreadInterruptedException)
//{
//}
//log.Info("------- Shutting Down ---------------------");
//sched.Shutdown(true);
//log.Info("------- Shutdown Complete -----------------");
SchedulerMetaData metaData = sched.GetMetaData();
log.Info(string.Format("Executed {0} jobs.", metaData.NumberOfJobsExecuted));
以下是我的app.config设置
<add key="quartz.scheduler.instanceId" value="AUTO"/>
<add key="quartz.threadPool.type" value="Quartz.Simpl.SimpleThreadPool, Quartz"/>
<add key="quartz.threadPool.threadCount" value="10"/>
<add key="quartz.threadPool.threadPriority" value="2"/>
<add key="quartz.jobStore.misfireThreshold" value="60000"/>
<add key="quartz.jobStore.clustered" value="true"/>
<add key="quartz.jobStore.type" value="Quartz.Impl.AdoJobStore.JobStoreTX, Quartz"/>
<add key="quartz.jobStore.driverDelegateType" value="Quartz.Impl.AdoJobStore.StdAdoDelegate, Quartz" />
<add key="quartz.jobStore.tablePrefix" value="QRTZ_" />
<add key="quartz.jobStore.dataSource" value="myDS"/>
<add key="quartz.jobStore.lockHandler.type" value="Quartz.Impl.AdoJobStore.UpdateLockRowSemaphore, Quartz"/>
<!-- i have modifed for this post -->
<add key="quartz.dataSource.myDS.connectionString" value="Server=mydatabaseconnectionstring goes here;Trusted_Connection=False;Encrypt=True;"/>
<add key="quartz.dataSource.myDS.provider" value="SqlServer-20"/>
<add key="quartz.jobStore.useProperties" value="true"/>
答案 0 :(得分:2)
这是因为ScheduleJob每次都会尝试添加作业。你应该使用带有重载的AddJob来指定是否覆盖现有的,或者只添加一次作业(检查是否存在),然后在需要时添加新的触发器。
使用AdoJobStore时,触发器和作业将在第二次运行时保留,因为它们是持久存在的。在您的情况下,您已经可以运行一次代码,因此作业存在于持久性作业存储中。使用RamJobStore,它自然会有所不同。