2015-08-25 1 views
0

У меня есть веб-приложение, на котором запущено множество заданий обработки данных на бэкэнд, поэтому вместо того, чтобы увязнуть с сервером, я хочу запланировать задания и решил дать Quartz. Чистый ход.планирование веб-сервисов в Quartz.Net - служба windows или singleton

Очевидная вещь, которую я предполагаю, заключается в создании планировщика как службы Windows. У меня что-то подобное работает, но найти службу Windows немного боль по нескольким причинам (один из них, если он сбой, его нужно перезапустить вручную).

Я думал, что более элегантный способ будет создать службу как синглтон, мои вопросы будут:

  • , если у меня есть несколько вызовов ASHX бэкэнда, можно просто объявить его как это:

    public static IScheduler Scheduler { get; private set; } 
    

в каждом ASHx и было бы одноэлементно во всех серверных вызовах?

  • Могу ли я проверить выполнение заданий scheduler.GetCurrentlyExecutingJobs(); и закрывающие планировщик вниз, если их нет?

  • Основная причина, по которой я хочу использовать Quartz.Net, - ограничить количество заданий, выполняемых одновременно, поэтому в основном я просто создаю простые задания, которые выполняются сейчас. Поэтому из того, что я прочитал, если нет доступных потоков, задание будет отклонено, а затем обработано после того, как потоки станут доступными снова. scheduler.GetCurrentlyExecutingJobs(); возвращает все отклоненные/ожидающие задания?

    • Как запустить планировщик, если он не работает? Он может быть недоступен, потому что IIS закрыл его или потому, что мой код закрыл его, если никаких заданий не запущено. В идеале, если я добавлю новое задание, планировщик запустится. Думаю, я мог бы поддерживать собственный список заданий в массиве и управлять им так - или есть ли способ сделать это через Quartz напрямую? Или мне лучше сделать планировщик постоянным, как это - IIS app pool recycle + quartz scheduling?

ответ

1

Поскольку у вас есть несколько вопросов, я скопировал их здесь для ясности:

  1. , если у меня есть несколько вызовов ASHX бэкэнда, можно просто объявить его как это ...

Если у вас есть несколько классов, определенных для вашего ashx, то каждый класс получит новый экземпляр планировщика. Так что нет, просто объявление частного статического свойства на каждом из них не дает вам одноэлемент. Если вы объявите публичное статическое свойство в своем файле global.asax, то да, у вас будет синглтон.

  1. Могу ли я проверить запуск планировщика заданий. GetCurrentlyExecutingJobs(); и закрыть планировщик вниз, если их нет?

Да. В качестве альтернативы вы можете вызвать метод выключения и использовать перегрузку, которая позволяет указать, ждать ли все задания, завершающиеся

  1. Есть ли scheduler.GetCurrentlyExecutingJobs(); вернуть все отклоненные/ожидающие задания?

Нет, только что исполняемых сейчас. Вы можете получить список запланированных заданий из планировщика, но позвонив GetJobKeys, а затем, возможно, позвонив по телефону GetJobDetail.

  1. Как запустить планировщик, если он работает?

Вы можете вызвать Start запустить планировщик, но вы не можете назвать это, если вы уже назвали Shutdown, поэтому вам придется создать новый экземпляр планировщика, а затем запустить его.

 Смежные вопросы

  • Нет связанных вопросов^_^