FileBatch類提供了一系列對批量并行讀寫操作支援(包括對FttpAdapter和FileAdapter),它跟并行讀寫的差別是不需要檢查結果,會等到所有并行讀寫任務全部完成才傳回,并在發生異常時提供事務補償支援。
1、批量并行讀:
public Result<byte[]>[] readAllBatch(TryByteReadAdapter[] fras)
實作對多個FttpReadAdapter任務的批量讀,輸入一個FttpReadAdapter數組,并行進行它們的讀取,直到每個FttpReadAdapter讀完後,以數組的方式批量輸出它們對應的結果,比如:
FttpReadAdapter[] fras = new FttpReadAdapter[3];
fras[0]=new FttpAdapter(fttppath).getFttpReader(0,5);
fras[1]=new FttpAdapter(fttppath).getFttpReader(5,5);
fras[2]=new FttpAdapter(fttppath).getFttpReader(10,5);
Result<byte[]>[] rs = new FileBatch().readAllBatch(fras);
上面表示并行從3個位置讀一個檔案内容,等全部讀完後,将對應的結果放在一個數組裡傳回
2、批量并行寫:
FttpWriteAdapter[] fwas = new FttpWriteAdapter[3];
fwas[0]=new FttpAdapter(fttppath).getFttpWriter(0,5);
fwas[1]=new FttpAdapter(fttppath).getFttpWriter(5,5);
fwas[2]=new FttpAdapter(fttppath).getFttpWriter(10,5);
Result<Integer>[] rs = new FileBatch().writeBatch(fwas, "abcde".getBytes());
上面表示并行對一個檔案的3個位置寫入“abcde”字元,等全部寫完後,傳回對應結果數組
注意:這裡跟并行讀寫一樣,3個FttpReadAdapter或者FttpWriteAdapter是由3個不同的FttpAdapter生成,而不是同一個生成
3、批量并行讀寫:
Result<Integer>[] rs = new FileBatch().readWriteBatch(fras,fwas);
表示将上面的批量讀和批量寫在一個過程中完成,從fras裡每個FttpReadAdapter讀,然後通過fwas裡對應的每FttpWriteAdapter寫入,所有讀寫完成後傳回寫入結果數組
4、事務補償處理:
在批量并行讀寫過程中,如果其中一個FttpReadAdapter或者FttpWriteAdapter發生錯誤,那麼架構會進行分布式事務處理,進行兩階段送出,然後調用undo操作進行事務補償處理,撤消已經産生的改動和影響。
FileBatch類提供了對undo方法的定義
public Result[] undo(Result[] rtarr)
rtarr是傳入的結果,然後傳回undo的撤消處理後的結果
比如調用readAllBatch發生錯誤,FileBatch會将結果傳入undo進行撤消操作,然後才傳回結果
是以開發者需要自己實作undo方法的内容,繼承FileBatch類覆寫undo方法:
public Result[] undo(Result[] rtarr){
for(int i=0;i<rtarr.length;i++){
if(rtarr[i].getStatus()==Result.EXCEPTION)
System.out.println("Result index"+i+" Error");
return rtarr;
}
上面的undo方法将發生異常的結果的序号輸出顯示
所有的批量讀寫方法都可以以排它的方式進行,指定boolean locked參數即可
另外:除了byte批量并行讀寫外,也支援所有的整形批量并行讀寫,api和操作幾乎類似
FttpBatchWriteReadDemo示範了一個批量并行讀、批量并行寫、批量并行讀寫操作和事務補償操作
郵箱:[email protected]
qq群:241116021
demo源碼指南及開發包下載下傳位址:
http://www.skycn.com/soft/68321.html