操作分布式文件之八:如何批量并行读写远程文件和事务补偿处理
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演示了一个批量并行读、批量并行写、批量并行读写操作和事务补偿操作
邮箱:Fourinone@yeah.net
企鹅群:241116021
demo源码指南及开发包下载地址:
http://www.skycn.com/soft/68321.html