Почему Quartz.net завершается, несмотря на repeatForever()

#asp.net-core #cron #quartz.net

#asp.net-core #cron #quartz.net

Вопрос:

Я использую Quartz.Сеть в моем asp.net Основное веб-приложение для запуска задания каждые 5 минут. Но через некоторое время он останавливается без причины… Не могли бы вы взглянуть на мою конфигурацию или / и на журналы Quartz?

Это моя конфигурация в program.cs

 services.AddQuartz(q =>
{
q.UseMicrosoftDependencyInjectionScopedJobFactory();

var jobKey = new JobKey("AppPushJob");

q.AddJob<AppPushJob>(opts => opts.WithIdentity(jobKey));

// Create a trigger for the job
q.AddTrigger(opts => opts
    .ForJob(jobKey) // link to the AppPushJob
    .WithIdentity("AppPushJob-trigger") // give the trigger a unique name
    .WithCronSchedule("0 0/5 6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23 * * ?")); ; // run every 5 minutes de 6h à 23h, tous les jours  
    });
            
// Add the Quartz.NET hosted service
services.AddQuartzHostedService(
            q => q.WaitForJobsToComplete = true
);
 

Запуск задания и выполнение всего, что он должен делать. Он повторяет процесс несколько раз, а затем завершает работу.

Это журнал для события ЗАПУСКА :

 2021-02-04 14:05:28.026  01:00 Information   Initialized Scheduler Signaller of type: Quartz.Core.SchedulerSignalerImpl
2021-02-04 14:05:28.026  01:00 Information   Quartz Scheduler v."3.2.3.0" created.
2021-02-04 14:05:28.027  01:00 Information   JobFactory set to: Quartz.Simpl.MicrosoftDependencyInjectionJobFactory
2021-02-04 14:05:28.027  01:00 Information   RAMJobStore initialized.
2021-02-04 14:05:28.032  01:00 Information   Scheduler meta-data: Quartz Scheduler (v3.2.3.0)     'QuartzScheduler' with instanceId 'NON_CLUSTERED'
  Scheduler class: 'Quartz.Core.QuartzScheduler' - running locally.
  NOT STARTED.
  Currently in standby mode.
  Number of jobs executed: 0
  Using thread pool 'Quartz.Simpl.DefaultThreadPool' - with 10 threads.
  Using job-store 'Quartz.Simpl.RAMJobStore' - which does not support persistence. and is not clustered.
 

Это журнал для конечного события :

 2021-02-04 14:25:30.767  01:00 Debug   Trigger instruction : NoInstruction
2021-02-04 14:25:51.659  01:00 Debug   Batch acquisition of 0 triggers
2021-02-04 14:26:14.861  01:00 Debug   Batch acquisition of 0 triggers
2021-02-04 14:26:26.741  01:00 Information   Scheduler "QuartzScheduler_$_NON_CLUSTERED" shutting down.
2021-02-04 14:26:26.744  01:00 Information   Scheduler QuartzScheduler_$_NON_CLUSTERED paused.
2021-02-04 14:26:26.752  01:00 Debug   Shutting down threadpool...
2021-02-04 14:26:26.752  01:00 Debug   Waiting for 0 threads to complete.
2021-02-04 14:26:26.752  01:00 Debug   No executing jobs remaining, all threads stopped.
2021-02-04 14:26:26.752  01:00 Debug   Shutdown of threadpool complete.
2021-02-04 14:26:26.758  01:00 Information   Scheduler QuartzScheduler_$_NON_CLUSTERED Shutdown complete.
 

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

 q.AddTrigger(opts => opts
    .ForJob(jobKey) // link to the AppPushJob
    .WithIdentity("AppPushJob-trigger") // give the trigger a unique name
    .WithSimpleSchedule(x => x
        .WithIntervalInMinutes(5)
        .RepeatForever())             //--> I thought this will be enough
);
 

Не могли бы вы рассказать le, что не так с этой конфигурацией, пожалуйста?

Предполагается, что задание ищет некоторые конкретные данные в базе данных и отправляет их в приложения для Android и ios с помощью ExpoSDK.

Спасибо

Комментарии:

1. Ваша программа по какой-то причине завершается? Quartz завершит работу как часть завершения Program.cs. Есть ли у вашего основного метода host.Run() / host. RunAsync() без условий выхода?

2. Спасибо за вашу помощь. В коде Program.cs нет причин для выхода. Но я заметил, что он завершается, когда на сайт больше никто не заходит. Как только я вызываю домашний URL-адрес в своем браузере, служба снова запускается. Что я могу сделать, чтобы стимулировать его, даже если на сайте никого нет? Я думал установить while(true) в моем основном методе AppPushJob, но в этом случае я не понимаю цели repeatForever() …

3. Веб-сервер должен определить, хочет ли он принудительно остановить сайт и, таким образом, также запустить Quartz. Вам необходимо настроить always on, чтобы сайт не переходил в спящий режим / не перерабатывался.

4. Хорошее решение, я не смотрел на IIS… В следующий раз! Спасибо

Ответ №1:

Я обнаружил, что основной метод program.cs завершал работу, когда на веб-сайте больше не было посетителей. Я искал способ заставить его работать непрерывно, но мне это не удалось (я не думал смотреть на IIS) … поэтому я переместил свою программу в наше внешнее приложение (а не в серверную часть), у которого всегда есть хотя бы один посетитель.