web-dev-qa-db-ja.com

Quartz.Netのクラスに引数を送信する方法

毎日8:00と20:00にクラスでメソッドを実行するためにQuartz.Net(バージョン2)を使用しています(IntervalInHours = 12)

Quartz.Netのチュートリアルと同じジョブとトリガーを使用したので、すべて問題ありませんが、クラスでいくつかの引数を渡し、それらの引数に基づいてメソッドを実行する必要があります。

Quartz.Netの使用中に引数を使用する方法を教えてもらえますか?

21
Hosein

JobDataMap を使用できます

jobDetail.JobDataMap["jobSays"] = "Hello World!";
jobDetail.JobDataMap["myFloatValue"] =  3.141f;
jobDetail.JobDataMap["myStateData"] = new ArrayList(); 

public class DumbJob : IJob
{
    public void Execute(JobExecutionContext context)
    {
        string instName = context.JobDetail.Name;
        string instGroup = context.JobDetail.Group;

        JobDataMap dataMap = context.JobDetail.JobDataMap;

        string jobSays = dataMap.GetString("jobSays");
        float myFloatValue = dataMap.GetFloat("myFloatValue");
        ArrayList state = (ArrayList) dataMap["myStateData"];
        state.Add(DateTime.UtcNow);

        Console.WriteLine("Instance {0} of DumbJob says: {1}", instName, jobSays);
    }
} 
38
Arsen Mkrtchyan

@ArsenMkrtの回答を拡張するために、 2.x-style fluent job config を実行している場合は、次のようにJobDataMapをロードできます。

var job = JobBuilder.Create<MyJob>()
    .WithIdentity("job name")
    .UsingJobData("x", x)
    .UsingJobData("y", y)
    .Build();
10
Todd Menier

概要

@ arsen-mkrtchyanの投稿を少し拡張して、本番環境での苦痛なサポートQuartzコードを回避できる重要なメモを付けましょう。

問題(永続性JobStoreの場合)

永続的なJobStoreを使用している場合は、JobDataMapのバージョン管理について覚えておいてください。 AdoJobStore。

要約(TL; DR)

  • JobDataの構築/編集について慎重に検討してください。そうしないと、将来のジョブのトリガーで問題が発生します。
  • 「quartz.jobStore.useProperties」構成パラメーターを 公式ドキュメントで推奨 として有効にして、バージョン管理の問題を最小限に抑えます。後でJobDataMap.PutAsString()を使用します。

詳細

ドキュメントにも記載されていますが、それほど強調されていませんが、たとえば次のような場合、大きなメンテナンスの問題が発生する可能性があります。アプリの次のバージョンでいくつかのパラメーターを削除します。

永続的なJobStore(このチュートリアルのJobStoreセクションで説明)を使用する場合は、JobDataMapに何を配置するかを慎重に決定する必要があります。これは、その中のオブジェクトがシリアル化されるため、クラスバージョン管理の問題が発生しやすくなるためです。

また、 関連ドキュメント に記載されているJobStoreの構成に関する関連メモがあります。

「quartz.jobStore.useProperties」構成パラメーターを「true」(デフォルトはfalse)に設定して、JobDataMapsのすべての値が文字列になることをAdoJobStoreに指示できるため、保存するのではなく、名前と値のペアとして保存できます。 BLOB列のシリアル化された形式のより複雑なオブジェクト。非文字列クラスをBLOBにシリアル化する際に発生するクラスのバージョン管理の問題を回避できるため、これは長期的にははるかに安全です。

1
Oleg V.