天天看點

操作分布式檔案之八:如何批量并行讀寫遠端檔案和事務補償處理

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

繼續閱讀