0

我正在组建一个需要扩展预定工作的系统。我正在使用 Quartz.Net 通过 CRON 触发器安排多个作业。作业的设计使得它们对于跨多个 Azure 角色实例的并发执行是安全的。

所有可用信息似乎都是关于确保 Quartz.Net 不会在多台机器上同时执行相同的作业,这是我目前看到的行为。

我实际上需要相反的(本质上是一个池而不是 Quartz.Net 调度程序集群)。例如,我想在 TimeY 跨两个角色实例执行 JobX。我希望同时发生两次处决。我目前只能让 Quartz 执行一个。

该实现当前使用具有两个实例的单个 Web 角色。从长远来看,这将随着许多工作角色实例也执行相同的计划任务而扩展。每个角色实例都会启动自己的调度程序实例并启动它。他们使用相同的石英配置,如下所示。

<?xml version="1.0" encoding="utf-8" ?>
<quartz>

  <add key="quartz.scheduler.instanceId" value="AUTO"/>
  <add key="quartz.scheduler.instanceName" value="QuartzScheduler" />

  <!-- Configure Thread Pool -->
  <add key="quartz.threadPool.type" value="Quartz.Simpl.SimpleThreadPool, Quartz" />
  <add key="quartz.threadPool.threadCount" value="10" />
  <add key="quartz.threadPool.threadPriority" value="Normal" />

  <!-- Configure Job Store -->
  <add key="quartz.jobStore.clustered" value="true"/>
  <add key="quartz.jobStore.misfireThreshold" value="60000" />
  <add key="quartz.jobStore.type" value="Quartz.Impl.AdoJobStore.JobStoreTX, Quartz" />
  <add key="quartz.jobStore.driverDelegateType" value="Quartz.Impl.AdoJobStore.SqlServerDelegate, Quartz" />
  <add key="quartz.jobStore.tablePrefix" value="quartz.QRTZ_" />
  <add key="quartz.jobStore.dataSource" value="config" />
  <add key="quartz.dataSource.config.provider" value="SqlServer-20" />

  <add key="quartz.plugin.xml.type" value="Quartz.Plugin.Xml.XMLSchedulingDataProcessorPlugin, Quartz" />
  <add key="quartz.plugin.xml.fileNames" value="~/QuartzJobs.config" />
</quartz>

如何让 Quartz.Net 在多台机器上执行并发作业?

4

1 回答 1

4

我已经确认解决方案是使用 RAMJobStore 而不是 ADOJobStore。每个角色实例中运行的每个调度程序将同时执行相同的作业和触发器。这允许 Quartz.Net 调度程序池同时运行相同的作业。

于 2013-05-09T23:08:43.950 回答