OpenDaylight:Data Store的同步与异步读写
来源:互联网 发布:小米盒子可以接mac 编辑:程序博客网 时间:2024/05/21 08:55
一、参照的项目官网地址: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 <V> void addCallback(final ListenableFuture<V> future,
final FutureCallback<? super V> callback, Executor executor)
用于给异步计算操作注册绑定回调方法,当异步操作完成,则立即调用绑定的回调方法,
其只是监听异步计算操作完成与否,完成则立即执行回调,否则不执行,也是异步的,其并不会改变读写的同步异步属性。
3.Data Store的读写
//Data Store的读
CheckedFuture<Optional<Stuscoreentery>, ReadFailedException> future_r;
Optional<Stuscoreentery> result = null;
future_r = readTransaction.read(LogicalDatastoreType.OPERATIONAL, this.writeiid);
Futures.addCallback(future_r, new LoggingFuturesCallBack<Optional<Stuscoreentery>>("Failed to write a student record to the stuscore", LOG));
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<Void, TransactionCommitFailedException> future_w = writeTransaction.submit();
Futures.addCallback(future_w, new LoggingFuturesCallBack<Void>("Failed to write a student record to the stuscore", LOG));
其中,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()就成了同步写,否则就是异步写;
欢迎共同探讨!转载请注明出处,谢谢!
- OpenDaylight:Data Store的同步与异步读写
- 同步与异步的概念
- DWR的同步与异步
- 同步与异步的理解
- 同步与异步的区别
- 线程的同步与异步
- 同步与异步的区别
- 同步与异步的区别
- 同步与异步的区别
- 异步与同步的理解
- 同步与异步的区别
- 异步与同步的区别
- 同步与异步的区别
- 同步与异步的概念
- 同步与异步的概念
- ajax的同步与异步
- 同步与异步的概念
- 进程的同步与异步
- AS开发中出现Error(八)——studio无法认出Android环境setup JDK
- ElasticSearch使用
- (转)OLED vs LED&LCD:哪种屏幕技术更胜一筹
- 全景分组插件
- .Net连接池救生员
- OpenDaylight:Data Store的同步与异步读写
- 点击页面的时候,控制台显示:"Config.getWebStores: java.sql.SQLException: ORA-00942:",SQL查不到,标识符无效
- 悠百佳骗子公司是骗局 坑我血汗钱
- LK的大体过程
- eve模拟器
- Awe JavaScript [1] 基本概念
- 分布式系统理论的CAP
- PAT甲级 1017
- 【直播系列之一】1篇文章看懂峰值带宽、流量、转码、连麦、截图五大直播计费方式