Azure - 多个工作者角色 - 无法存储作业:无法存储作业:'job6',因为已存在此作业标识

时间:2012-06-22 20:54:19

标签: c# azure quartz.net jobs

我正在使用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"/>

我可以这样做吗...在添加作业或触发器之前检查数据库中的记录,如果不存在则添加作业?这样做可以吗?

- 或 - 是否更容易实施Azure队列来安排我的工作?谢谢!

1 个答案:

答案 0 :(得分:2)

这是因为ScheduleJob每次都会尝试添加作业。你应该使用带有重载的AddJob来指定是否覆盖现有的,或者只添加一次作业(检查是否存在),然后在需要时添加新的触发器。

使用AdoJobStore时,触发器和作业将在第二次运行时保留,因为它们是持久存在的。在您的情况下,您已经可以运行一次代码,因此作业存在于持久性作业存储中。使用RamJobStore,它自然会有所不同。