java.util.concurrent之高手應用(mop-commons包讀後感)

1,com.xxx.mop.portal.web.listener.ThreadPoolListener是個監聽器,他在容器啓動時候的就實例化了一個ThreadPool,這個容器每隔60秒就啓動一個業務定時同步線程。
2,com.xxx.mop.bfp.biz.sync.impl.BizSyncTaskPoller用來定時獲取業務訂購日誌中,狀態爲-1(-1:未執行;0:正在執行:1:已經處理完畢)的訂購進行重新處理。每次取出的條數是根據庫中配置的“perFetchUnhandleLimit”參數來獲取的。取出來未處理的日誌後,轉化成對應的訂單(CorpOrder/UserOrder),將每個訂單轉化成一個業務同步任務(com.xxx.mop.bfp.biz.sync.impl.BizSyncTask),然後放入線程池中進行處理。
3,com.xxx.mop.bfp.biz.sync.impl.BizSyncTask的作用就是向業務系統同步任務,然後更新bialog的狀態。
4,com.xxx.mop.commons.concurrent.ThreadPool自定義的線程池管理器,採用了ThreadPoolExecutor實現。
5,com.xxx.mop.commons.concurrent.TrackingExecutor自定義的線程池包裝類。這個線程池可以獲取在線程池關閉時未完成的任務清單。實際將未完成的任務添加到列表中返回是在com.xxx.mop.commons.concurrent.RunnableWrapper中完成的,當任務在執行時,如果發現線程池完畢或者當前的線程被終止,那麼正在執行的任務就會加入未完成的任務隊列(List<Runnable)中,然後在線程池最終關閉時將這些任務再寫回數據庫中。AbstractExecutorService在關閉時能夠獲取到從未執行的任務清單,但是不能獲取到已經提交但是還沒執行完畢(還沒取消執行)的任務清單,因此這裏設計了這個類,用戶在線程池關閉時同時獲取已經提交但是還未執行完畢的任務,然後取消這些任務(將任務的狀態更新爲-1,com.xxx.mop.bfp.biz.sync.impl.BizSyncTask中重寫了reject()和cancel()方法),以備下次線程再次啓動時重新執行這些任務。
6,注意java.util.Collections的用法。如Collections.emptyList()。
7,ThreadPool中關閉所有同步線程是通過添加一個“鉤子”實現的。
 Runtime.getRuntime().addShutdownHook(new Thread(new Runnable() {
                  public void run() {
                        logger.info("==shutdown all bizsync worker thread==");
                        shutdownAllThreadPool();
                  }
            }));

     上面的方法添加了一個鉤子,當虛擬機關閉時就會啓動這個線程,shutdownAllThreadPool()方法再將所有還沒有完成的任務重新更新成初始狀態。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章