Quartz.Net Работа Прогресс

2

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

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

Теги:
quartz-scheduler

2 ответа

2
Лучший ответ

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

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

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

  • 0
    Имеет смысл ... Мне нужно обновить графический интерфейс через вызов веб-службы, который, в свою очередь, должен видеть процесс конкретной работы? Возможно, придется немного перестроить решение. Думая об использовании статического списка сортировки для хранения соответствующего статуса / хода выполнения всех запущенных заданий.
  • 0
    Да, все это зависит от количества рабочих мест, которые у вас есть и т. Д. В небольших развертываниях с управляемым количеством триггеров / заданий, которые вы могли бы получить, просто опросив сервисный уровень об информации или осуществив прямой поиск по запросу пользователя. У вас может быть уникальный идентификатор для каждого из ваших экземпляров заданий или выполнения заданий (тогда это может быть время + триггер), а затем вы можете обновить метаинформацию для запуска этого задания. Кварц имеет карты данных о работе, но они не предназначены для системной интеграции.
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.

Кроме того, вы можете установить задание Durable и PersistJobDataAfterExecution, поэтому после его завершения вы можете получить свой прогресс и все остальное через scheduler.GetJobDetail(..) и затем получить доступ к его JobDataMap.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню