Ход работы Quartz.Net

Есть ли простой способ для IJob публиковать данные из Job. У меня есть задание, выполняющее процесс импорта, но я хотел бы получить ход выполнения, найдя задание и запросив его.

Я думал, что смогу использовать JobDetails, но, похоже, это не отражает изменения, внесенные в задание?


person Jan de Jager    schedule 07.08.2009    source источник


Ответы (2)


Не существует встроенного способа, который легко дал бы вам то, что вы ищете. Но не так уж сложно опубликовать информацию о прогрессе на каком-либо другом объекте через публикацию подписки. Вы также можете периодически записывать информацию о ходе выполнения в постоянное хранилище — это также даст вам возможность легко повторить попытку, когда вы знаете последний успешный бит, который был обработан.

Внешний поток/процесс также может определить статус, если он опрашивает цель, в которую вы импортируете, и у вас будет где-то информация об общем количестве элементов, которые будут импортированы.

Задания Quartz.NET — это единицы, которые обрабатываются как... хорошо единица, и поэтому нет представления о том, сколько еще предстоит сделать. Или вам нужна эта информация в другой работе, которая зависит от процесса импорта?

person Marko Lahma    schedule 07.08.2009
comment
Имеет смысл ... Мне нужно обновить графический интерфейс через вызов веб-службы, который, в свою очередь, должен видеть процесс конкретной работы? Возможно, потребуется немного изменить архитектуру решения. Думая об использовании статического списка сортировки для хранения соответствующего статуса/прогресса всех запущенных заданий. - person Jan de Jager; 07.08.2009
comment
Да, все это зависит от количества заданий, которые у вас есть, и т. д. В небольших развертываниях с управляемым количеством триггеров/заданий вы можете обойтись, просто опросив свой сервисный уровень об информации или направив поиск, инициированный пользователем. У вас может быть уникальный идентификатор для каждого из ваших экземпляров заданий или запусков заданий (тогда идентификатор может быть временем + триггер), а затем вы можете обновить метаинформацию для этого запуска задания. В Quartz есть карты данных заданий, но они не предназначены для системной интеграции. - person Marko Lahma; 10.08.2009

Это вполне возможно.

Я бы пошел с чем-то вроде этого. В работе:

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.

person Evgenyt    schedule 29.04.2013