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()就成了同步写,否则就是异步写;


欢迎共同探讨!转载请注明出处,谢谢!

原创粉丝点击