Есть ли простой способ для IJob публиковать данные из задания. У меня есть работа, выполняющая процесс импорта, но хотелось бы получить прогресс, просмотрев Job и запросив его.
Я думал, что могу использовать JobDetails, но, похоже, не отражает изменения, внесенные в Job?
Существует не встроенный способ, который бы облегчил вам то, что вы ищете. Но не сложно опубликовать информацию о ходе работы на каком-либо другом объекте через публикацию подписки. Вы также можете периодически записывать информацию о ходе работы в постоянное хранилище - это также даст вам возможность легко повторить попытку, когда вы узнаете последний успешный бит, который был обработан.
Внешний поток/процесс также может определять статус, если он опросил цель, в которой вы импортируете, и у вас будет информация об общих элементах, которые будут импортированы.
Задания Quartz.NET - это единицы, которые обрабатываются как блок... скважины, и поэтому не существует понятия о том, сколько еще предстоит сделать. Или вам нужна эта информация в другом задании, которое зависит от процесса импорта?
Это вполне возможно.
Я бы пошел с чем-то вроде этого. В работе:
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
.