問題描述:
批量的數據,現在需要從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 :
解決代碼示例如下(部分業務邏輯還未完成)