一、参照的项目官网地址:https://wiki.opendaylight.org/view/Controller_Core_Functionality_Tutorials:Application_Development_Tutorial
二、涉及的类:
接口,
java.util.concurrent.Future
com.google.common.util.concurrent.ListenableFuture
com.google.common.util.concurrent.CheckedFuture
类,
com.google.common.util.concurrent.Futures
三、类图关系:
四、Data Store的同步读写与异步读写解析
1.Data Store的读写事务
首先,介绍一下OpenDaylight中对Data Store的操作通过类org.opendaylight.controller.md.sal.binding.api.DataBroker操作;
其次,将DataBroker实例化,通过其实例生成事务对象,以读写Data Store,一共可生成三类事务,Write-only,Read-only,Read-Write,可根据需要生成;
如,
//生成读事务
ReadOnlyTransaction readTransaction = this.dataBroker.newReadOnlyTransaction();
//生成写事务
WriteTransaction writeTransaction = this.dataBroker.newWriteOnlyTransaction();
2.Future、ListenableFuture、CheckedFuture、Futures、读写事务等与同步异步的关系
首先,读、写事务都继承AsyncTransaction,所以都是异步的;
其次,CheckedFuture继承ListenableFuture,ListenableFuture继承Future;
Future接口表示一个异步计算操作的结果,即把结果保存至这个接口的实现类中,调用其get()等方法即可把结果取出来
然后,Future的get()方法和CheckedFuture的checkedGet()方法都具有阻塞作用,实现同步作用,从而能将读写全部变为同步
Futures类是一个与Future相关的静态工具类,其有一个方法
public static
final FutureCallback super V> callback, Executor executor)
用于给异步计算操作注册绑定回调方法,当异步操作完成,则立即调用绑定的回调方法,
其只是监听异步计算操作完成与否,完成则立即执行回调,否则不执行,也是异步的,其并不会改变读写的同步异步属性。
3.Data Store的读写
//Data Store的读
CheckedFuture
Optional
future_r = readTransaction.read(LogicalDatastoreType.OPERATIONAL, this.writeiid);
Futures.addCallback(future_r, new LoggingFuturesCallBack
try {
result = future_r.get();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ExecutionException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
this.stuscoreentery = result.get();
//Data Store的写
WriteTransaction writeTransaction = this.dataBroker.newWriteOnlyTransaction();
//put相当于添加和替换
writeTransaction.put(LogicalDatastoreType.OPERATIONAL,
this.writeiid,
new StuscoreenteryBuilder(this.stuscoreentery).setAverg(String.valueOf(averg)).build()
);
CheckedFuture
Futures.addCallback(future_w, new LoggingFuturesCallBack
其中,Data Store的读流程为read()->Ftures.addCallback()[只为异步计算操作添加回调,不影响读写的同步或异步]->get()/checkedGet()[具有同步读写作用]->get()
写流程为put()->submit()->Ftures.addCallback()[只为异步计算操作添加回调,不影响读写的同步或异步]->get()/checkedGet()[具有同步读写作用]
五、小结
1> 如果不需要为异步计算操作添加回调,则可省掉Ftures.addCallback();
2> 读有返回值,所以需要get()/checkedGet()[具有同步读写作用]->get()两步来取回值,从而读只可能是同步的,若暂时不对返回值进行操作,只是读,则没有get()/checkedGet()的影响,还是异步读,而写没有返回值,所以加get()/checkedGet()就成了同步写,否则就是异步写;
欢迎共同探讨!转载请注明出处,谢谢!