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 ========================
      通過近兩個月的生產環境使用,發現以上解決方案可行,推薦使用之
相關文章
相關標籤/搜索