问题
I'm using Quartz.Net scheduler to schedule my jobs. I'm using ADOJOBSTORE to store all these values.
Couldn't store job: Unable to store Job: 'job6', because one already exists with this identification When I try to run it throwing the above error. Any idea?
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));
Here are my app.config settings
<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"/>
Can I do some thing like this... Before adding the job or trigger Check for the record from the database and if not exists add the job?. Is it ok to do this?
- or - is it easier to implement Azure Queues to schedule my jobs? Thanks!!
回答1:
This is because ScheduleJob will try add the job every time. You should either use AddJob with overload specifying whether to overwrite existing or just add the job once (check for existence) and then add new triggers when needed.
When using AdoJobStore the trigger and jobs will be there on the second run as they are persisted. In your case you have propably already ran the code once and thus the job exists the persistent job store. With RamJobStore it would naturally be a different thing.
来源:https://stackoverflow.com/questions/11163977/azure-multiple-worker-roles-couldnt-store-job-unable-to-store-job-job6