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