跨多个Azure实例同时运行Quartz.Net作业

问题描述:

我正在组合一个需要扩展预定工作的系统。我使用Quartz.Net通过CRON触发器安排多个作业。这些作业的设计使它们可以安全地跨多个Azure角色实例进行并发执行。跨多个Azure实例同时运行Quartz.Net作业

所有可用的信息似乎都是关于确保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在多台机器上执行并行作业?

+0

我认为一种解决方案是让每个调度程序实例(在每个角色实例中)由其自己的ADO实例实例支持。这对我不起作用,因为我希望能够动态地扩展角色实例。 – 2013-05-09 06:28:13

+0

请看看我前几天写的博客文章:http://gauravmantri.com/2013/01/23/building-a-simple-task-scheduler-in-windows-azure/。 – 2013-05-09 07:04:41

+0

嗨Gaurav,是的,我读过你的文章。我不需要博客租约,因为我希望每个作业实例同时在机器上执行。角色日志中的屏幕截图表明这对您有用。仍然没有得到那一点工作。 你为什么使用IInterruptableJob作业? 我想我的解决方案是不使用ADO作业存储。每个调度程序不需要知道其他调度程序,它们可以独立执行。我不认为ADO就业商店在我的情况下给了我什么。 – 2013-05-09 12:20:16

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