2010-07-08 38 views
3

我們有一個作爲Windows服務運行的Quartz.Net安裝。這運行良好。我們還有一個ASP.Net應用程序,用於添加/編輯作業並監視作業。我們偶爾會在ASP.Net應用程序中出現錯誤。錯誤是「計劃程序已關閉」。或「名稱爲'JOB_SCHEDULER_NAME'的計劃程序已存在。」從ASP.Net應用程序檢索Quartz.net作業信息

如果刷新頁面,它工作正常。我已經能夠通過反覆快速打開同一頁面的多個實例來重新創建問題。所以,我目前的理論是,我們得到Scheduler實例的方式不是線程安全的。

作爲一個例子,這裏是我們如何獲取工作信息的簡化版本:

var schedulerFactory = new StdSchedulerFactory(); 
var scheduler = schedulerFactory.GetScheduler(); 
var jobDetail = scheduler.GetJobDetail("SomeJobName", "SomeJobGroup"); 

在ASP.Net應用程序加載頁面時,這是正在做。

的ASP.Net的配置設置是:

<quartz> 
    <add key="quartz.scheduler.instanceName" value="COMPANY_NAME_JobScheduler" /> 
    <add key="quartz.scheduler.instanceId" value="Provider.DEV" /> 
    <add key="quartz.jobStore.type" value="Quartz.Impl.AdoJobStore.JobStoreTX, Quartz" /> 
    <add key="quartz.jobStore.useProperties" value="true" /> 
    <add key="quartz.jobStore.dataSource" value="default" /> 
    <add key="quartz.jobStore.tablePrefix" value="QRTZ_" /> 
    <add key="quartz.jobStore.lockHandler.type" value="Quartz.Impl.AdoJobStore.UpdateLockRowSemaphore, Quartz" /> 
    <add key="quartz.jobStore.driverDelegateType" value="Quartz.Impl.AdoJobStore.SqlServerDelegate, Quartz " /> 
    <add key="quartz.dataSource.default.connectionString" value="server=PROD_SQL_SERVER;uid=SQL_USER;pwd=SQL_PASSWORD;database=Scheduler" /> 
    <add key="quartz.dataSource.default.provider" value="SqlServer-20" /> 
</quartz> 

Windows服務正在初始化這樣的調度:

var schedulerFactory = new StdSchedulerFactory(); 
var scheduler = schedulerFactory.GetScheduler(); 

Windows服務配置爲:

<quartz> 
    <add key="quartz.scheduler.instanceName" value="COMPANY_NAME_JobScheduler" /> 
    <add key="quartz.scheduler.instanceId" value="Service.PROD" /> 

    <add key="quartz.threadPool.type" value="Quartz.Simpl.SimpleThreadPool, Quartz" /> 
    <add key="quartz.threadPool.threadCount" value="10" /> 
    <add key="quartz.threadPool.threadPriority" value="2" /> 

    <add key="quartz.jobStore.misfireThreshold" value="60000" /> 
    <add key="quartz.jobStore.type" value="Quartz.Impl.AdoJobStore.JobStoreTX, Quartz" /> 
    <add key="quartz.jobStore.useProperties" value="true" /> 
    <add key="quartz.jobStore.dataSource" value="default" /> 
    <add key="quartz.jobStore.tablePrefix" value="QRTZ_" /> 
    <add key="quartz.jobStore.lockHandler.type" value="Quartz.Impl.AdoJobStore.UpdateLockRowSemaphore, Quartz" /> 
    <add key="quartz.jobStore.driverDelegateType" value="Quartz.Impl.AdoJobStore.SqlServerDelegate, Quartz " /> 

    <add key="quartz.dataSource.default.connectionString" value="server=PROD_SQL_SERVER;uid=SQL_USER;pwd=SQL_PASSWORD;database=Scheduler" /> 
    <add key="quartz.dataSource.default.provider" value="SqlServer-20" /> 
</quartz> 

是有更好的方法來「查詢」調度程序?

編輯:增加了更多的配置信息

+0

需要更多信息。例如:什麼是調度器工廠配置? (無論是在客戶端還是在服務器端)。你在哪裏實例化客戶端中的調度器工廠和調度器? – 2010-07-08 21:19:49

+0

增加了更多信息。這有幫助嗎? – 2010-07-08 21:31:43

回答

5

我們已經設置了調度是在我們的應用中單,這解決了問題我們:

public class MyScheduler 
{ 
    static MyScheduler() 
    { 
     _schedulerFactory = new StdSchedulerFactory(getProperties()); 
     _scheduler = _schedulerFactory.GetScheduler(); 
    } 
    public static IScheduler GetScheduler() 
    { 
     return _scheduler; 
    } 

    private static readonly ISchedulerFactory _schedulerFactory; 
    private static readonly IScheduler _scheduler; 
} 
+0

我也遇到了類似的問題。你能解釋一下爲什麼我們需要將它轉移到單身人士課堂上。在我的appp中,我需要在一天內創建數千個工作,我有點擔心單身類的負載。 – Brainchild 2013-06-03 11:05:39

0

而是同時具有調度的直接連接到數據庫,請嘗試使Web調度程序連接到服務調度程序through remoting