我正在组建一个需要扩展计划工作的系统。我正在使用Quartz.Net通过CRON触发器安排多个作业。作业的设计使得它们对于跨多个Azure角色实例的并发执行是安全的。
所有可用的信息似乎都是关于确保Quartz.Net不会在多台机器上同时执行相同的工作,这是我目前看到的行为。
我实际上需要相反的(实际上是一个池而不是Quartz.Net调度程序集群)。例如,我有一个JobX,我想在TimeY上跨两个角色实例执行。我希望同时发生两次执行。我目前只能让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跨多台机器执行并发作业?
答案 0 :(得分:4)
我已经确认解决方案是使用RAMJobStore而不是ADOJobStore。在每个角色实例中运行的每个调度程序将同时执行相同的作业和触发器。这允许Quartz.Net调度程序池同时运行相同的作业。