前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >OpenDaylight开发-DataStoreChange监听器三种类型

OpenDaylight开发-DataStoreChange监听器三种类型

作者头像
SDNLAB
发布2018-04-03 10:33:38
1.1K0
发布2018-04-03 10:33:38
举报
文章被收录于专栏:SDNLABSDNLABSDNLAB

OpenDaylight中的所有数据都保存在DataStore中,并且数据以树形结构存储,可参考OpenDaylight开发中的介绍。外界对DataStore的访问有BA和BI两种方式,这两种方式具有映射关系,BI像是BA的底层实现,通过QName实现对数据的索引,而BA更像是在BI上的封装,不能以BI的方式对数据进行准确的索引,但是提供了更方便的调用接口等。

由于数据存储在DataStore中,因此ODL中对DataStore的访问非常重要。DataStore的变化会触发DataStoreChange事件的发生,设置监听器收到变化事件后触发任务是ODL的运行机制。最近研究了三种Listener类型: DataChangeListener, DataTreeChangeListener, DomDataTreeChangeListener.

DataChangeListener

DataChangeListener是最简单的使用方式。Toaster中用的就是这种Listener,使用Binding-aware方式访问DataStore,具体调用方式在ODL(2)中有了说明,这里不再重复。其中需注意的是数据通过IID(InstanceIdentifier)作为索引/标识。使用DataChangeListener往往需要对整颗树进行监听,树中任何一个叶子节点的变化都会触发DataChangeListener事件。

DataTreeChangeListener

DataTreeChangeListener,数据的标识在IID的基础上,进一步精确,通过DataTreeIdentifier进行数据在树型结构中存储位置的定位。通过DataTreeIdentifier可以定位到树中的树干,可以进行更精确的变化位置的监听。使用方式:

Implement: 
    class VlanProvider implements DataTreeChangeListener<Vlan>
Identifier: 
    InstanceIdentifier<vlan> Vlan_IID = InstanceIdentifier.builder(Device.config.class).child(Switch.class).child(vlan.class);
    DataTreeIdentifier<vlan> vlan_path = new DataTreeIdentifier<>(LogicalDatastoreType.CONFIGURATION, Vlan_IID);
Register Listener with DataBroker:
    this.VlanListener = dataBroker.registerDataTreeChangeListener(vlan_path, this);

首先当前类实现DataTreeChangeListener接口,然后声明DataTreeIdentifier,最后注册监听器。监听函数代码如下:

public void onDataTreeChanged(Collection<DataTreeModification<Vlan>> changed){
    for(final DataTreeModification<Vlan> change: changed){
        final DataObjectModification<Vlan> rootChange = change.getRootNode();
        switch(rootChange.getModificationType()){
            case WRITE:
                LOG.info("Write - before : {} after : {}", rootChange.getDataBefore(), rootChange.getDataAfter());
                break;
            case SUBTREE_MODIFIED:
                LOG.info("Write - before : {} after : {}", rootChange.getDataBefore(), rootChange.getDataAfter());
                break;
            case DELETE:
                LOG.info("Write - before : {} after : {}", rootChange.getDataBefore(), rootChange.getDataAfter());
                break;
        }
    }
}

通过getRootNode()获取当前变化节点,getModificationType()获得数据树变化类型,分三种:WRITE, SUBTREE_MODIFIED, DELETE。写入,子树变化,或删除。getDataBefore()获得变化前的数据,getDataAfter()获得变化后的数据。

DOMDataTreeChangeListener

通过DOMDataBroker访问DataStore,使用Binding Independent类型,使用QName对数据树进行索引和数据的定位。相关名词:

  • DOMDataBroker
  • DOMDataWriteTransaction
  • YangInstanceIdentifier
  • DataTreeChange(DOMDataTreeChange)
  • Transaction Chain

具体代码如下:

DOMDataWriteTransaction tx = domDataBroker.newWriteOnlyTransaction();
YangInstanceIdentifier yid = YangInstanceIdentifier.builder().node(TestExec.QNAME).node(OuterList.QNAME).nodeWithKey(OuterList.QNAME, element.getId()).build();
tx.put(LogicalDatastoreType.CONFIGURATION, yid, element);
try {
    tx.submit().checkedGet();
} catch( TransactionCommitFailedException e){
    LOG.error("Transaction failed: {}", e.toString());
}

使用BI方式,通过QNAME进行索引,可对数据树中的任何位置进行精确的定位,直接获取QNAME对应位置的变化事件。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2016-02-02,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 SDNLAB 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • DataChangeListener
  • DataTreeChangeListener
  • DOMDataTreeChangeListener
相关产品与服务
对象存储
对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档