我正在编写一个Opendaylight应用程序,它将在删除、添加或更新流规则时提取所有流规则。
要在添加、删除或更新流时获得通知,应用程序应该提供一个扩展salFlowListener接口的侦听器。但是,当我创建应用程序目录结构时,Opendaylight在线教程中并不清楚逻辑要放在哪里。
此外,当使用YANG模型扩充通知服务时,存在编译错误。
这是获取通知的正确方法吗?是否有任何清晰的在线教程可供我参考?
谢谢。
发布于 2016-02-16 10:55:05
public class ChangeListener implements DataChangeListener {
private static final Logger logger = LoggerFactory.getLogger(DhcontrollerListener.class);
private DataBroker dataBroker;
public DhcontrollerListener(DataBroker broker) {
this.dataBroker = broker;
//flow
InstanceIdentifier<Flow> flowPath = InstanceIdentifier.builder(Nodes.class)
.child(Node.class).augmentation(FlowCapableNode.class).child(Table.class)
.child(Flow.class).build();
dataBroker.registerDataChangeListener(LogicalDatastoreType.OPERATIONAL, flowPath, this,
DataChangeScope.BASE);
}
@Override
public void onDataChanged(AsyncDataChangeEvent<InstanceIdentifier<?>, DataObject> change) {
if (change == null) {
logger.info("DhcontrollerListener ===>>> onDataChanged: change is null");
return;
}
handleCreatedFlow(change);
handleUpdatedFlow(change);
handleDeletedFlow(change);
}
private void handleCreatedFlow(AsyncDataChangeEvent<InstanceIdentifier<?>, DataObject> change) {
Map<InstanceIdentifier<?>, DataObject> createdData = change.getCreatedData();
if (createdData == null) {
logger.info("handleCreatedFlow ===>>> getRemovedPaths==null");
return;
}
for (Map.Entry<InstanceIdentifier<?>, DataObject> entry : createdData.entrySet()) {
final DataObject dataObject = entry.getValue();
if (dataObject instanceof Flow) {
Flow flow = (Flow) dataObject;
logger.info("create flow : " + flow.getCookie() + " " + flow.getKey().toString());
}
}
}
private void handleUpdatedFlow(AsyncDataChangeEvent<InstanceIdentifier<?>, DataObject> change) {
Map<InstanceIdentifier<?>, DataObject> updatedData = change.getCreatedData();
if (updatedData == null) {
logger.info("handleUpdatedFlow ===>>> getRemovedPaths==null");
return;
}
for (Map.Entry<InstanceIdentifier<?>, DataObject> entry : updatedData.entrySet()) {
final DataObject dataObject = entry.getValue();
if (dataObject instanceof Flow) {
Flow flow = (Flow) dataObject;
logger.info("update flow : " + flow.getCookie() + " " + flow.getKey().toString());
}
}
}
private void handleDeletedFlow(AsyncDataChangeEvent<InstanceIdentifier<?>, DataObject> change) {
Map<InstanceIdentifier<?>, DataObject> originalData = change.getOriginalData();
Set<InstanceIdentifier<?>> removedData = change.getRemovedPaths();
if (removedData == null) {
logger.info("handleDeletedFlow ===>>> getRemovedPaths==null");
return;
}
for (InstanceIdentifier<?> instanceIdentifier : removedData) {
final DataObject dataObject = originalData.get(instanceIdentifier);
if (dataObject instanceof Flow) {
Flow flow = (Flow) dataObject;
logger.info("remove flow : " + flow.getCookie() + " " + flow.getPriority() + " "
+ flow.getMatch().getIpMatch() + " " + flow.getKey().toString());
}
}
}}
我要做的就是设置InstanceIdentifier。设置不同的InstanceIdentifier,还可以监听节点、表等的变化。
https://stackoverflow.com/questions/34364035
复制相似问题