Quartz.net планировщик не принимает последние изменения в файле класса заданий

#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.

Я не знаю, как работает ваш процесс развертывания, но я бы увидел по крайней мере два варианта.

  1. Перезапустите процесс после развертывания новой версии DLL, похоже на базовое развертывание
  2. Сделайте так, чтобы ваши задания загружали шаблоны из файловой системы, чтобы вы могли изменять их с частотой, отличной от той, которую вы используете для основного процесса, но хороший процесс выпуска также обновит двоичные файлы до того же уровня, поэтому это может быть не рекомендуемым подходом

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

1. у нас есть консольное приложение, которое запускается только один раз и добавляет задания в планировщик. Затем у нас есть служба Windows, которая запускает планировщик. При каждом развертывании эта служба Windows перезапускается. Должны ли мы также удалять и добавлять задания в планировщик после каждого развертывания?

2. Quartz загружает тип задания после перезапуска, поэтому вы должны увидеть изменения. Если у вас есть какое-то состояние в картах данных заданий, они автоматически не обновляются, если вы не сделаете это вручную.

3. Я обновил вопрос с помощью свойств кварца, которые я использую. Я не устанавливаю никакого состояния при создании карты данных задания. Я ничего не упускаю..