51学通信论坛2017新版

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 1274|回复: 0
打印 上一主题 下一主题

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

[复制链接]

 成长值: 15769

  • TA的每日心情
    开心
    2022-7-17 17:50
  • 2444

    主题

    2544

    帖子

    7万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    74104
    跳转到指定楼层
    楼主
    发表于 2017-9-17 12:19:17 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    OpenDaylight中的所有数据都保存在DataStore中,并且数据以树形结构存储,可参考OpenDaylight开发中的介绍。外界对DataStore的访问有BA和BI两种方式,这两种方式具有映射关系,BI像是BA的底层实现,通过QName实现对数据的索引,而BA更像是在BI上的封装,不能以BI的方式对数据进行准确的索引,但是提供了更方便的调用接口等。


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

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

    DataTreeChangeListener

    DataTreeChangeListener,数据的标识在IID的基础上,进一步精确,通过DataTreeIdentifier进行数据在树型结构中存储位置的定位。通过DataTreeIdentifier可以定位到树中的树干,可以进行更精确的变化位置的监听。使用方式:
    Shell
    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,最后注册监听器。监听函数代码如下:
    Shell
    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:
    case DELETE:
    }
    通过getRootNode获取当前变化节点,getModificationType获得数据树变化类型,分三种:WRITE, SUBTREE_MODIFIED, DELETE。写入,子树变化,或删除。getDataBefore获得变化前的数据,getDataAfter获得变化后的数据。

    DOMDataTreeChangeListener


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

    具体代码如下:
    Shell
    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对应位置的变化事件。
    转载自:Guangze Zhao博客,博客地址:http://www.zhaoguangze.com/
    声明:本文转载自网络。版权归原作者所有,如有侵权请联系删除。
    扫描并关注51学通信微信公众号,获取更多精彩通信课程分享。

    本帖子中包含更多资源

    您需要 登录 才可以下载或查看,没有帐号?立即注册

    x
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    Archiver|手机版|小黑屋|51学通信技术论坛

    GMT+8, 2025-2-26 22:14 , Processed in 0.071699 second(s), 33 queries .

    Powered by Discuz! X3

    © 2001-2013 Comsenz Inc.

    快速回复 返回顶部 返回列表