2

Quartz.Netスケジューラーを使用してジョブをスケジュールしています。これらすべての値を格納するためにADOJOBSTOREを使用しています。

ジョブを保存できませんでした:ジョブを保存できません:'job6'、このIDを持つものがすでに存在するため、実行しようとすると上記のエラーがスローされます。何か案が?

        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"/>

このようなことを行うことはできますか...ジョブまたはトリガーを追加する前にデータベースからレコードを確認し、存在しない場合はジョブを追加しますか?これをしても大丈夫ですか?

-または-AzureQueuesを実装してジョブをスケジュールする方が簡単ですか?ありがとう!!

4

1 に答える 1

2

これは、ScheduleJob が毎回ジョブを追加しようとするためです。AddJob をオーバーロードとともに使用して、既存のものを上書きするか、一度だけジョブを追加して (存在を確認して)、必要に応じて新しいトリガーを追加するかを指定する必要があります。

AdoJobStore を使用する場合、トリガーとジョブは永続化されているため、2 回目の実行時に存在します。あなたの場合、おそらくすでにコードを一度実行しているため、ジョブは永続的なジョブストアに存在します。RamJobStore では、当然別物になります。

于 2012-06-23T15:56:05.523 に答える