【问题标题】:Quartz.net scheduler does not take latest changes to Jobs class fileQuartz.net 调度程序不会对 Jobs 类文件进行最新更改
【发布时间】:2021-06-02 23:31:32
【问题描述】:

在我们的 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 表)?

请帮忙..我被困在这里,找不到任何相关的帖子。

提前谢谢你!!

【问题讨论】:

    标签: c# quartz-scheduler quartz.net


    【解决方案1】:

    如果 Quartz 进程已经在运行并且 DLL 内容(作业)已经加载,它们将不会再次自动加载。这就是 .NET CLR 的工作方式。一旦进程从 givem DLL 加载了类型,Quartz 就不会重新加载它。

    我不知道您的部署过程是如何工作的,但我至少会看到两个选项。

    1. 部署新的 DLL 版本后重启进程,听起来像基本部署
    2. 让您的作业从文件系统加载模板,这样您就可以按照与主流程不同的节奏来更改它们 - 但良好的发布流程也会将二进制文件更新到相同的级别,因此这可能不是推荐的方法

    【讨论】:

    • 我们有一个只运行一次的控制台应用程序,它将作业添加到调度程序。然后我们有一个启动调度程序的 Windows 服务。在每次部署时,此 Windows 服务都会重新启动。我们是否也应该在每次部署后删除作业并将其添加到调度程序?
    • Quartz 在重新启动后加载作业类型,因此您应该会看到更改。如果您在工作数据地图中有一些状态,除非您手动执行,否则它们不会自动更新。
    • 我已经用我正在使用的石英属性更新了这个问题。创建作业数据映射时,我没有设置任何状态。我错过了什么吗..
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-13
    • 2014-09-01
    相关资源
    最近更新 更多