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コード接続は次のようになります.
しかしながら、スケジューラ情報は割り当てられたメモリに格納されるため、アプリケーションが停止すると、すべてのスケジューラ情報が失われる.再起動間にスケジューリング情報を永続化する必要がある場合は、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>