2009-08-07 11 views
1

IJobがジョブ内からデータを簡単に発行する方法はありますか?私は、インポートプロセスを実行しているジョブを持っていますが、ジョブを検索して要求して進捗状況を取得したいと考えています。Quartz.Net Job Progress

私はJobDetailsを使用できると思っていましたが、Job内の変更を反映していないようです。

答えて

2

あなたが探しているものを簡単に与える組み込みの方法はありません。しかし、パブリッシュ・サブスクライブを介して進捗情報を他の施設に公開することは難しくありません。また、定期的に進捗情報を永続ストレージに書き込むこともできます。これにより、最後に処理された正常なビットが分かっていれば簡単に再試行できるという利点もあります。

外部スレッド/プロセスは、インポートするターゲットをポーリングして、インポートしようとしているアイテムの情報をどこかに持っていればステータスを判断することもできます。

Quartz.NETジョブは、ウェル単位として処理される単位であるため、まだ実行されていない程度の概念はありません。または、インポートプロセスに依存する別のジョブでこの情報が必要ですか?

+0

意味があります...私は、特定の仕事のプロセスを見る必要があるWebサービス呼び出しによってGUIを更新する必要がありますか?ソリューションを少し再構築する必要があるかもしれません。すべての実行中のジョブのステータス/進行状況を格納する静的な並べ替えリストを使用することを考えます。 –

+0

はい、これはあなたが持っている仕事の量によって異なります。管理可能な量のトリガー/ジョブを備えた小規模な展開では、サービスレイヤーを情報についてポーリングしたり、直接ユーザーが開始した検索によって取得できます。 ジョブインスタンスまたはジョブ実行ごとに一意のIDを持つことができます(idはtime + triggerの可能性があります)。そこで実行されているジョブのメタ情報を更新できます。 Quartzはジョブデータマップを持っていますが、システム統合のためのものではありません。 –

3

かなり可能です。

私はこのようなものに行きます。仕事で :進捗状況を検索したいコードで

public virtual void Execute(IJobExecutionContext context) 
{ 
    int i = 0; 
    while (i++ < 100) 
    { 
     context.JobDetail.JobDataMap["progress"] = i; 
     Thread.Sleep(1000); 
    } 
} 

var jobs = scheduler.GetCurrentlyExecutingJobs(); 
foreach (var j in jobs) 
{ 
    Console.WriteLine("Progress of {0} is {1}", 
     j.JobDetail.Key, 
     j.JobDetail.JobDataMap["progress"]); 
} 

あなたはもちろんのGetCurrentlyExecutingJobs、結果をフィルタリングすることができます。

また、あなたはDurablePersistJobDataAfterExecutionする仕事を設定することができ、それが完了した後、あなたはscheduler.GetJobDetail(..)を経由して、その進捗状況や他の何かを取得し、その後そのJobDataMapにアクセスすることができます。