Quartz創建多個不同名字的scheduler實例

需求
創建多個不同的Scheduler實例,每個實例自主啓動、關閉    

問題
如果直接用
SchedulerFactory sf = new StdSchedulerFactory();  

Scheduler scheduler = sf.getScheduler(); 



獲取的scheduler是從倉儲SchedulerRepository裏面取出來的,倉儲註冊scheduler的時候爲每個scheduler分配一個唯一的名字,問題就在於這裏,Quartz默認有個配置文件quartz.properties,裏面定義了這個名字,這樣的話,每次通過sf.getScheduler()獲取的都是同一個實例,(假設你認爲get出來的都是不同實例)把其中的某一個shceduler shutdown的話,其他scheduler也會關閉掉,因爲它們其實是同一個實例!

嘗試使用:

sf.getScheduler("給定名字")



發現返回的都是null,翻看源碼,此方法並沒有進行創建對象的邏輯。而僅僅是lookup而已!

然後再嘗試通過DirectSchedulerFactory.getInstance().createXXX的方法創建Scheduler實例,結果發現這些方法的參數...:

.createScheduler(schedulerName, schedulerInstanceId, threadPool, jobStore);



這確實很靈活!但是真TM底層!突然感到很無奈。

Google了很久,StackOverFlow上面也有類似的問題,但是都說沒有API直接提供創建給定名字的Scheduler實例。但是無意中想起來,Quartz貌似支持配置文件初始化的,於是翻到了Quartz的默認配置文件(在其jar包裏)quartz.properties。

# Default Properties file for use by StdSchedulerFactory
# to create a Quartz Scheduler Instance, if a different
# properties file is not explicitly specified.

org.quartz.scheduler.instanceName: DefaultQuartzScheduler
org.quartz.scheduler.rmi.export: false
org.quartz.scheduler.rmi.proxy: false
org.quartz.scheduler.wrapJobExecutionInUserTransaction: false

org.quartz.threadPool.class: org.quartz.simpl.SimpleThreadPool
org.quartz.threadPool.threadCount: 10
org.quartz.threadPool.threadPriority: 5
org.quartz.threadPool.threadsInheritContextClassLoaderOfInitializingThread: true

org.quartz.jobStore.misfireThreshold: 60000

org.quartz.jobStore.class: org.quartz.simpl.RAMJobStore



於是就照葫蘆畫瓢的,將這些配置內容拷貝一份,在代碼裏寫到一個Properties裏面,然後調用初始化方法。搞定!

解決方案
顯式使用StdSchedulerFactory,調用其initialize方法,並且自己定義填寫配置內容:
StdSchedulerFactory sf = new StdSchedulerFactory();
Properties props = new Properties();
props.put("org.quartz.scheduler.instanceName", "你定義的名字");
props.put("org.quartz.threadPool.threadCount", "10");#必填
sf.initialize(props);
scheduler = sf.getScheduler();
System.out.println(scheduler.getSchedulerName());
scheduler.shutdown();



本文轉載自http://my.oschina.net/laiweiwei/blog/122280
發佈了23 篇原創文章 · 獲贊 3 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章