2013-05-09 115 views
0

我正在組合一個需要擴展預定工作的系統。我使用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

回答

4

我確認解決方案是使用RAMJobStore而不是ADOJobStore。在每個角色實例中運行的每個調度程序將同時執行相同的作業和觸發器。這允許Quartz.Net調度器池同時運行相同的作業。