0

我有一段代碼會使用Quartz創建作業。這段代碼將被多個線程Quartz Scheduler不能在多線程服務中工作

ISchedulerFactory fac = new StdSchedulerFactory(); 
       sched = fac.GetScheduler(); 

// schedele job 

    sched.ScheduleJob(job1, trigger1); 
       sched.Shutdown(); 

有些時候我歌廳錯誤信息,而與名獲得調度

計劃被稱爲「{0}」已存在。

由於pere一些論壇suggeton如果我將getscheduler邏輯移動到singleton類,它工作正常,沒有任何問題。我不知道爲什麼我們需要將它移到單身課程。

我真的不明白是什麼導致了這個問題。

+0

你是使用jmx還是rmi代理遠程調度程序? – Shinchan

+0

我正在使用Quartz的.Net版本 – Brainchild

回答

0

這段代碼將被多個線程

通過這種調用,它隱含的比賽條件可以在調用線程在實例調度實例之間發生。 而且應該防止創建具有相同名稱的調度程序是合乎邏輯的。石英中創建調度程序實例的代碼可能不是線程安全的。 :-)

+0

請你解釋一下。爲什麼不希望有多個具有相同名稱的調度程序。我在想,如果每個線程在工作完成後都被允許有相同的名字,那麼我可以在那個時候關閉調度器。對於單身人士,我無法關閉調度程序,我只好保留調度程序,直到整個系統完全卸載。 – Brainchild

+0

調度程序名稱可能是調度程序實例的主鍵,這就是爲什麼您無法使用相同名稱創建多個實例的原因 。 您的併發線程正在嘗試同時實例化調度程序。所以競賽狀況正在發生。 您希望獲得已創建的調度程序實例並將其分發到併發線程中。但不幸的是,這不可能,因爲getScheduler()是石英代碼。 – Shinchan