#c# #quartz-scheduler #quartz.net
Вопрос:
В нашем asp.net приложение веб-форм у нас есть ежедневные задания, которые должны отправлять пользователям некоторые электронные письма.
Недавно мы начали использовать Quartz.net чтобы задания выполнялись непоследовательно. Я использую магазин заданий ADO для планирования заданий и создания триггеров. При создании данных задания я также указываю .dll(полный путь) и имя класса, которое должно быть выполнено для этого задания. Это консольное приложение, которое запускается только один раз.
IScheduler scheduler = StdSchedulerFactory.GetDefaultScheduler();
JobDataMap jobData = new JobDataMap();
jobData.Add("JobID", jobDataRow["Id"].ToString());
jobData.Add("AssemblyName", assemblyName);
jobData.Add("ClassName", className);
jobData.Add("AssemblyPath", assemblyPath);
var jobDetail = JobBuilder.Create()
.StoreDurably()
.WithIdentity(name)
.SetJobData(jobData)
.Build(); ;
ITrigger trigger = TriggerBuilder.Create()
.WithIdentity(triggerName)
.WithCronSchedule(cronexpr)
.StartNow()
.Build();
scheduler.ScheduleJob(jobDetail, trigger, true);
Затем у нас есть служба Windows, которая запускает планировщик. Эта служба Windows останавливается и перезапускается после каждой сборки.
StdSchedulerFactory schedulerFactory = new
StdSchedulerFactory(schedulerProperties);
scheduler = schedulerFactory.GetScheduler();
scheduler.Start();
Заявленные свойства кварца :-
<add key="quartz.threadPool.threadCount" value="10" />
<add key="quartz.threadPool.threadPriority" value="2" />
<add key="quartz.jobStore.misfireThreshold" value="60000" />
<add key="quartz.scheduler.instanceId" value="Auto" />
<add key="quartz.threadPool.type" value="Quartz.Simpl.SimpleThreadPool, Quartz" />
<add key="quartz.jobStore.type" value="Quartz.Impl.AdoJobStore.JobStoreTX, Quartz" />
<add key="quartz.jobStore.dataSource" value="default" />
<add key="quartz.jobStore.tablePrefix" value="QRTZ_" />
<add key="quartz.jobStore.clustered" value="false" />
<add key="quartz.jobStore.lockHandler.type" value="Quartz.Impl.AdoJobStore.UpdateLockRowSemaphore, Quartz" />
<add key="quartz.dataSource.default.provider" value="SqlServer-20" />
<add key="quartz.jobStore.driverDelegateType" value="Quartz.Impl.AdoJobStore.SqlServerDelegate, Quartz" />
<add key="quartz.jobStore.useProperties" value="true" />
<add key="quartz.jobStore.misfireThreshold" value="60000" />
<add key="quartz.plugin.triggHistory.type" value="Quartz.Plugin.History.LoggingJobHistoryPlugin" />
<add key="quartz.scheduler.exporter.type" value="Quartz.Simpl.RemotingSchedulerExporter, Quartz" />
<add key="quartz.scheduler.exporter.port" value="555" />
<add key="quartz.scheduler.exporter.bindName" value="QuartzScheduler" />
<add key="quartz.scheduler.exporter.channelType" value="tcp" />
<add key="quartz.scheduler.exporter.channelName" value="httpQuartz" />
Теперь проблема в том, что когда в файл класса вносятся какие — либо изменения, например изменения в существующий шаблон электронной почты, задание по-прежнему отправляет электронные письма, используя старый шаблон электронной почты, при запуске из планировщика Quartz.
Если мы запустим задание вручную, то электронные письма будут отправлены правильно с новыми изменениями.
Нужно ли нам воссоздавать карту данных задания Quartz(таблицу QRTZ_JOB_DETAILS) каждый раз, когда происходит изменение файлов классов?
Пожалуйста, помогите.. Я застрял здесь и не смог найти ни одного связанного с этим поста.
Заранее благодарю вас!!
Ответ №1:
Если процесс Quartz уже запущен и содержимое библиотеки DLL (задания) загружено, они не будут автоматически загружены снова. Вот как работает .NET CLR. Как только процесс загрузит тип из библиотеки DLL givem, он не будет перезагружен Quartz.
Я не знаю, как работает ваш процесс развертывания, но я бы увидел по крайней мере два варианта.
- Перезапустите процесс после развертывания новой версии DLL, похоже на базовое развертывание
- Сделайте так, чтобы ваши задания загружали шаблоны из файловой системы, чтобы вы могли изменять их с частотой, отличной от той, которую вы используете для основного процесса, но хороший процесс выпуска также обновит двоичные файлы до того же уровня, поэтому это может быть не рекомендуемым подходом
Комментарии:
1. у нас есть консольное приложение, которое запускается только один раз и добавляет задания в планировщик. Затем у нас есть служба Windows, которая запускает планировщик. При каждом развертывании эта служба Windows перезапускается. Должны ли мы также удалять и добавлять задания в планировщик после каждого развертывания?
2. Quartz загружает тип задания после перезапуска, поэтому вы должны увидеть изменения. Если у вас есть какое-то состояние в картах данных заданий, они автоматически не обновляются, если вы не сделаете это вручную.
3. Я обновил вопрос с помощью свойств кварца, которые я использую. Я не устанавливаю никакого состояния при создании карты данных задания. Я ничего не упускаю..