IJob がジョブ内からデータを公開する簡単な方法はありますか? インポート プロセスを実行しているジョブがありますが、ジョブを検索して要求することで進行状況を取得したいと考えています。
JobDetails を使用できるかもしれないと思ったのですが、Job 内で行われた変更が反映されていないようですか?
IJob がジョブ内からデータを公開する簡単な方法はありますか? インポート プロセスを実行しているジョブがありますが、ジョブを検索して要求することで進行状況を取得したいと考えています。
JobDetails を使用できるかもしれないと思ったのですが、Job 内で行われた変更が反映されていないようですか?
それはかなり可能です。
私はこのようなもので行きます。仕事中:
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 の結果をフィルタリングできます。
また、ジョブをDurable
およびに設定できるため、ジョブが完了した後、その進行状況やその他のものを取得して、後でアクセスするPersistJobDataAfterExecution
ことができます。scheduler.GetJobDetail(..)
JobDataMap
探しているものを簡単に提供する組み込みの方法はありません。しかし、publish subscribe を介して他の施設に進捗情報を公開することもそれほど難しくありません。また、進行状況情報を永続ストレージに定期的に書き込むこともできます。これにより、処理された最後の成功したビットがわかっている場合に、簡単に再試行できるという利点もあります。
インポート先のターゲットをポーリングした場合、外部のスレッド/プロセスもステータスを判断でき、インポートされるアイテムの合計に関する情報がどこかにあるでしょう。
Quartz.NET ジョブは、ユニットとして処理されるユニットであるため、まだ実行されていないことがどれだけあるかという概念はありません。それとも、輸入プロセスに依存する別の仕事でこの情報が必要ですか?