利用Java併發包實現高效可靠流水線任務處理模型

問題描述:

    批量的數據,現在需要從DB/文件系統中讀出一些數據,之後經過過濾,驗證,轉換,格式化 etc , 最終寫入到文件/DB裏. 

解決思路:

       基本上有以下兩個方面 ,並行(多 JVM)+併發(多線程)。由於並行涉及到分佈式處理,暫不討論, 下面主要說的是單 JVM併發實現的情況 .這裏主要通過 concurrent包裏面的 BlockingQueue ,ThreadPool 以及基本的生產者消費者模型實現可靠流水線任務模型。
步驟及其需要處理的問題:
 1.數據分類/分塊
 2.分階段處理,(eg :load ->filter->process->persist)
 3.任務線程生命週期管理(任務線程異常/結束報告,關閉任務線程)。

具體實現:

 1 .MasterTask : 管理Task負責流水線的創建和工作task生命週期的管理 .
    
   類圖如下:
    
   
  屬性功能介紹:

   1) masterQueue :此隊列爲MasterTask和工作Task共享, 是工作線程report的主要通道 , Mastertask循環監聽來自工作線程的Msg 
         a) StopTaskMessage , 將工作Task 移出taskList.
         b)  ExceptionTaskMessage ,強制終止所有正在運行的線程,(loop taskList設置 isStop=true)
    2) taskList :這個列表主要存儲正在運行的工作task .
    3) exeService: 線程池
 
   流程圖:
   

  
 2.AbstractInOutTask :工作線程從incoming隊列讀取msg經過一系列的處理將結果放入到outgoing隊列.

  
   類圖如下:
    
   
   屬性功能介紹:

    1)outgoingQueue:此隊列爲相鄰的兩個階段的 所有工作Task共享, 用於工作線程轉發Msg 到下一個階段, 對於當前工作task而言當前task結果需要放入到這個隊列上。
    2) incomingQueue:  對於當前工作task而言當前task需要循環取msg從這個隊列上 .
    3) isStoped: 關閉開關
    4) masterQueue :與MasterTask共享,參考MasterTask.
    5) counter :記錄當前階段工作組task大小,用於正常情況下的工作task自結束。(接受EndTaskMsg)
 
   流程圖:
    
   
     

  3.消息傳遞流程圖.
    



測試問題示例:

   現在有一些文件裏面存儲的是線程運行的方法棧信息,現在需要按照下面的規則將輸入轉換成輸出,結果(按原來的順序)寫入另一個文件。
   Input   : 每個完整數據塊包含:[線程名,時間戳,方法棧列表,換行分隔符]
   Output: 每個完整數據塊包含:[線程名,時間戳,方法棧列表,方法棧深度;換行分隔符]
   eg :

解決代碼示例如下(部分業務邏輯還未完成) 




 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章