#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) … поэтому я переместил свою программу в наше внешнее приложение (а не в серверную часть), у которого всегда есть хотя бы один посетитель.