Quartz.NET-AdoJobStoreジョブストレージ

4966 ワード

Quartzには、2つの基本ジョブストレージタイプがあります.1つ目のタイプは、通常のメモリを使用してスケジューラ情報を永続化するRAM JobStoreと呼ばれます.このジョブ・ストレージ・タイプは、構成、構築、および実行が最も容易です.Quartz.NetではデフォルトでRAMJobStoreが使用されます.多くのアプリケーションでは、このジョブストレージは十分です.
しかしながら、スケジューラ情報は割り当てられたメモリに格納されるため、アプリケーションが停止すると、すべてのスケジューラ情報が失われる.再起動間にスケジューリング情報を永続化する必要がある場合は、2番目のタイプのジョブストレージが必要になります.この問題を修正するためにNETはAdoJobStoreを提供しています.名前の通り、作業倉庫はADOを通過する.NETはすべてのデータをデータベースに格納します.データの持続性のコストは、パフォーマンスの低下と複雑さの向上です.すべてのデータをADOを通過します.NETはデータベース可に保存されます.その配置はRAMJobStoreよりやや複雑で、速度もそれほど速くありません.しかし、パフォーマンスの欠陥はそれほど悪くありません.特に、データベース・テーブルのプライマリ・キーにインデックスを作成した場合です.
AdoJobStore
Oracle、MySQL、MS SQLServer 2000、HSQLDB、PostreSQL、DB 2を広く使用しているほとんどのデータベースで作業できます.AdoJobStoreを使用するには、まずQuartzが使用するデータベース・テーブルのセットを作成する必要があります.Quartzのdatabasetablesでライブラリ・テーブルを作成するSQLスクリプトを見つけることができます.データベースタイプのスクリプトが見つからない場合は、既存のスクリプトを見つけて、データベースに変更する必要があります.注意すべきことは、すべてのQuartzライブラリ名がQRTZ_であることです.接頭辞として(例えば、表「QRTZ_TRIGGERS」、および「QRTZ_JOB_DETAIL」)を用いる.実際には、AdoJobStoreの接頭辞が何であるかを教えてくれれば、接頭辞を任意の接頭辞に設定できます(Quartzプロパティファイルで構成されています).1つのデータベースで複数のschedulerインスタンスを使用する場合、異なる接頭辞を構成すると、複数のライブラリテーブルを作成できます.
SQL Serverコード接続は次のようになります.
            //AdoJobStoreRunner
            NameValueCollection properties = new NameValueCollection();
            properties["quartz.scheduler.instanceName"] = "TestScheduler";
            properties["quartz.scheduler.instanceId"] = "instance_one";
            properties["quartz.threadPool.type"] = "Quartz.Simpl.SimpleThreadPool, Quartz";
            properties["quartz.threadPool.threadCount"] = "5";
            properties["quartz.threadPool.threadPriority"] = "Normal";
            properties["quartz.jobStore.misfireThreshold"] = "60000";
            properties["quartz.jobStore.type"] = "Quartz.Impl.AdoJobStore.JobStoreTX, Quartz";
            properties["quartz.jobStore.driverDelegateType"] = "Quartz.Impl.AdoJobStore.StdAdoDelegate, Quartz";
            properties["quartz.jobStore.useProperties"] = "false";
            properties["quartz.jobStore.dataSource"] = "default";
            properties["quartz.jobStore.tablePrefix"] = "QRTZ_";
            properties["quartz.jobStore.clustered"] = "true";
            // if running MS SQL Server we need this
            properties["quartz.jobStore.selectWithLockSQL"] = "SELECT * FROM {0}LOCKS UPDLOCK WHERE LOCK_NAME = @lockName";
            properties["quartz.dataSource.default.connectionString"] = "server=local;database=quartz;user id=sa;pwd=sa;pooling=false;";
            properties["quartz.dataSource.default.provider"] = "SqlServer-20";
            ISchedulerFactory sf = new StdSchedulerFactory(properties);
            IScheduler sched = sf.GetScheduler();
            string schedId = sched.SchedulerInstanceId;
            int count = 1;
            for (int i = 0; i < 10; i++)
            {

                //  
                IJobDetail job = JobBuilder
                        .Create<Job1>()
                        .WithIdentity(" " + i.ToString(), " 1")
                        .RequestRecovery() // ask scheduler to re-execute this job if it was in progress when the scheduler went down...
                        .Build();

                DateTimeOffset runTime = DateBuilder.EvenMinuteDate(DateTimeOffset.UtcNow);

                ITrigger trigger = TriggerBuilder.Create()
                    .WithIdentity("trigger" + i.ToString(), "group1")
                    .StartAt(runTime)
                    .Build();
                //  
                sched.ScheduleJob(job, trigger);
            
            }
            //  
            sched.Start();

<configuration>
  <configSections>
    <section name="quartz" type="System.Configuration.NameValueSectionHandler, System, Version=1.0.5000.0,Culture=neutral, PublicKeyToken=b77a5c561934e089" />
  </configSections>
  <quartz>
    <add key="quartz.scheduler.instanceName" value="ExampleDefaultQuartzScheduler" />

    <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.type" value="Quartz.Simpl.RAMJobStore, Quartz" />
  </quartz>
</configuration>