Использование Quartz.NET как служба Windows


Я пишу компонент планировщика, и я планировал использовать Quartz.net. мои требования таковы:

  1. пусть планировщик работает 24x7 (остановка / сбой допустимы, его просто нужно будет запустить снова)
  2. иметь возможность видеть, какие задания/триггеры запланированы через веб-страницу
  3. возможность добавлять новые задания / триггеры через веб-страницу


Поскольку мне нужен постоянно работающий планировщик, я планировал иметь службу Windows. К сожалению, там ничего не видно. будьте любым способом, чтобы веб-страницы взаимодействовали с планировщиком, запущенным в службе Windows. Я попытался получить экземпляр со следующим кодом, собранным из примеров Turan Arora :

        NameValueCollection properties = new NameValueCollection();
        properties["quartz.scheduler.instanceName"] = "ServerScheduler";

        // set thread pool info
        properties["quartz.threadPool.threadCount"] = "0";

        // set remoting expoter
        properties["quartz.scheduler.proxy"] = "true";
        properties["quartz.scheduler.proxy.address"] = "tcp://localhost:555/QuartzScheduler";

        // get a reference to the scheduler
        ISchedulerFactory sf = new StdSchedulerFactory(properties);
        IScheduler sched = sf.GetScheduler();


Идя по этому маршруту, я получаю сообщение об ошибке: "планировщик с именем "ServerScheduler" уже существует.(ServerScheduler-это имя планировщика по умолчанию.) После некоторого чтения, кажется, что решение состоит в реализации одноэлементного шаблона для создания экземпляра и возврата этот экземпляр на протяжении всего жизненного цикла планировщика.

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

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

1 2

1 ответ:

Что вы хотите сделать в этом случае, это либо подключиться через удаленное подключение, как вы уже пробовали, просто убедитесь, что вы работаете Quartz.NET процессы на одной машине, у которых разные имена экземпляров.

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