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


  • _http://my.oschina.net/laiweiwei/blog/122280
      • 需求
        創建多個不同的Scheduler實例,每個實例自主啟動、關閉    

      • 問題
        如果直接用
      • SchedulerFactory sf = newStdSchedulerFactory();
      • 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方法,並且自己定義填寫配置內容:
    • 1    StdSchedulerFactory sf = new StdSchedulerFactory();
      2    Properties props = new Properties();
      3    props.put("org.quartz.scheduler.instanceName", "你定義的名字");
      4    props.put("org.quartz.threadPool.threadCount", "10");#必填
      5    sf.initialize(props);
      6    scheduler = sf.getScheduler();
      7    System.out.println(scheduler.getSchedulerName());
      8    scheduler.shutdown();
    • 以上方案通過初步測試使用。但是還需要在生產環境下使用看看......反饋情況將在這里補填

      =================== 最新反饋 2013-05-08 11:39 ========================
      經過近兩個月的生產環境使用,發現以上解決方案可行,推薦使用之


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM