BluePrint自定义扩展

来源:互联网 发布:php常用命令 编辑:程序博客网 时间:2024/05/22 07:09

ODL服务加载经历了blueprint-config-subsytem-blueprint这个过程

但最新提供了blueprint增加了自定义的扩展,如rpc-implementation。所以特地对于blueprint的扩展功能学习并记录。

标准的blueprint主要提供了四种定义:bean、service、reference、referecne-list
ODL扩展blueprint提供了:
notification-listenerrpc-servicerouted-rpc-implementationrpc-implementationaction-provideraction-servicespecific-reference-liststatic-reference
以上使用参考相关文档。现在以新增sq-print标签为例简要介绍扩展blueprint的开发流程与细节
1、扩展的blueprint的解析功能也是以bundle存在,并加载在OGSI中

public class BlueprintBundleTracker implements BundleActivator
该Bunlde的入口类,实现BundleActivator,并重写start方法,在start方法中,需要进行OSGI事件的监听

 @Override    public void start(BundleContext context) throws Exception {        LOG.info("SQBlueprint bundle starting...");        registerNamespaceHandler(context);        registerBlueprintEventHandler(context);    }
重点关注registerNamespaceHandler,对blueprint中配置解析事件进行了监听,这样当其它bundle进行blueprint解析时,则可以被该扩展bundle监听到,从而触发后序的处理流程。

   private void registerNamespaceHandler(BundleContext context) {        Dictionary<String, Object> sqNamespaceProperty = new Hashtable<>();        sqNamespaceProperty.put("osgi.service.blueprint.namespace", SQNamespaceHandler.NAMESPACE_1_0_0);        namespaceReg = context.registerService(NamespaceHandler.class.getName(),                new SQNamespaceHandler(), sqNamespaceProperty);    }

注意在POM文件中,需要将该类,定义为启动类

<Bundle-Activator>com.zte.sunquan.blueprint.main.BlueprintBundleTracker</Bundle-Activator>


2、注意到上面监听osgi.service.blueprint.namespace,定义了处理类SQNamespaceHanlder,对于扩展的tag,则在这个类中进行处理

public class SQNamespaceHandler implements NamespaceHandler {

该类包括方法

getSchemaLocation:用于指定xsd文件地址

getManagedClasses:

parse:处理tag,如新增的sq-print

decorate:处理属性定义,如ODL中定义的odl:use-default-for-reference-types


3、定义新增tag sq-print

<xsd:schema xmlns="http://opendaylight.org/xmlns/blueprint/v1.0.0" xmlns:xsd="http://www.w3.org/2001/XMLSchema"    xmlns:bp="http://www.osgi.org/xmlns/blueprint/v1.0.0"    targetNamespace="http://opendaylight.org/xmlns/blueprint/v1.0.0" elementFormDefault="qualified"    attributeFormDefault="unqualified" version="1.0.0">  <xsd:import namespace="http://www.osgi.org/xmlns/blueprint/v1.0.0"/>  <xsd:complexType name="SQPrint">    <xsd:attribute name="value" type="xsd:string" use="required"/>  </xsd:complexType>  <xsd:element name="sq-print" type="SQPrint"/>


这样在blueprint的配置文件中,则可以使用

<odl:sq-print value="hello,world"></odl:sq-print>



ps.注意Decorate和Parse方法,都要返回有效的ComponentMetadata

 MutableBeanMetadata metadata = context.createMetadata(MutableBeanMetadata.class);            metadata.setId(context.generateId());            metadata.setScope(BeanMetadata.SCOPE_SINGLETON);            metadata.setActivation(ReferenceMetadata.ACTIVATION_EAGER);            metadata.setRuntimeClass(SQPrintServiceBean.class);            metadata.setInitMethod("init");            metadata.addProperty("value", createValue(context, element.getAttribute("value")));

当设置init和destory方法,则RuntimeClass类SQPrintServiceBean中,必须实现该方法

addPropert方法,即会注入进SQPrintServceBean属性。


执行:


代码后面补上