当前位置:   article > 正文

OSGi实战 笔记_osgi框架

osgi框架

目标:弥补java模块化的不足
架构:框架(运行环境)+标准服务(常见任务)

一、OSGi框架:三层

模块层
生命周期层
服务层

创建应用程序方法:

  1. 设计:服务接口+客户端
  2. 实现服务提供者和客户端组件
  3. 服务提供者和客户端组件打包为独立的jar文件,加上OSGi元数据
  4. 启动OSGi框架
  5. 安装启动jar文件

模块层

OSGi模块指bundle(含元数据的jar文件)
用META-INF/MANIFEST.MF文件添加元数据信息,声明导入包、导出包

Bundle-Description: One-Ping-Only sample application
Bundle-License: http://www.apache.org/licenses/LICENSE-2.0.txt
Bundle-ManifestVersion: 2
Bundle-Name: onos-app-oneping
Bundle-SymbolicName: org.onosproject.onos-app-oneping
Bundle-Version: 1.10.0.SNAPSHOT
Created-By: Apache Maven Bundle Plugin
Export-Package: org.onos.oneping;uses:="org.onosproject.core,org.onospro
 ject.net.flow,org.onosproject.net.flowobjective,org.onosproject.net.pac
 ket";version="1.10.0"
Import-Package: 
 com.google.common.collect;version="[22.0,23)",
 org.onlab.packet;version="[1.10,2)",
 org.onosproject.core;version="[1.10,2)",
 org.onosproject.event;version="[1.10,2)",
 org.onosproject.net;version="[1.10,2)",
 org.onosproject.net.flow;version="[1.10,2)",
 org.onosproject.net.flow.criteria;version="[1.10,2)",
 org.onosproject.net.flowobjective;version="[1.10,2)",
 org.onosproject.net.packet;version="[1.10,2)",
 org.slf4j;version="[1.7,2)"
Require-Capability: osgi.ee;filter:="(&(osgi.ee=JavaSE)(version=1.8))"
Service-Component: OSGI-INF/org.onos.oneping.OnePing.xml
Tool: Bnd-3.2.0.201605172007
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24

生命周期层

bundle生命周期的操作、bundle如何访问执行环境

想初始化一个驱动程序
将一个指定的类声明为激活器activator,实现OSGi接口。接口中包含BundleContext类型的参数,作为访问OSGi框架的媒介,可访问OSGi的所有功能。

将Activator信息添加到MANIFEST.MF文件

服务层

应用编程模型。服务的发布、查找、绑定交互模式
服务提供者发布服务到服务注册中心,服务客户端搜素中心,查找可供使用的服务

需要做的:
服务:接口+接口实现
服务可见可用:创建一个bundle激活器,start()、stop()方法

start()使用BundleContext将服务注册到服务注册中心,提供服务实现的接口名、实际的服务实例、服务属性

ctx..registerService(InterfaceService.class.getName(), Impl, null)
  • 1

stop()方法可在bundle停止前注销服务(没必要,会自动注销)

client使用激活器检索间接的服务引用,并使用间接引用去访问服务对象的实例,start()

ServiceReference services = ctx.getServiceReferences(InterfaceService.class.getName());
((InterfaceService) ctx.getService(services)).getInterfaceInfo();
  • 1
  • 2

二、服务组件框架 blueprint

参考1
模块用来处理静态代码和编译时的依赖关系,组件解决实例和执行时的依赖关系。
对于bundle,成为组件需要实现一个bundle激活器。

组件容器管理器/xml的属性

看这个XML 中的 xmlns 等属性的意义

·bean:用来描述创建Java实例的元素,可以指定实例初始化的类名、构造方法、构造方法的入参及属性。
·service:将bean发布为OSGi Service。
·reference:通过接口名引用一个OSGi Service,可以指定一个特定的属性过滤器。
·reference-list:通过接口名引用多个OSGi Service,可以指定一个特定的属性过滤器。

bean与service

bean(与spring beans相同的基本语义)

<bean id="DictionaryService" class="cn.com.service.DictionaryServiceImpl" />
  • 1

bean这种是在bundle内部使用,不暴露对外,但是service是一个bundle提供给另外一个bundle使用

初始化可以使用activation=“eager”或"lazy"设置

service 允许组件提供OSGi服务
service-properties服务属性

entry:定义map条目,key value

reference

Service引用,从OSGi服务注册中心为组件获得一个服务,注册中心已注册服务的代理对象

cardinality参数指定引用的服务是否是可选的,以及需要几个这样的服务。它的值有4种:
0…1 – Optional and unary.
1…1 – Mandatory and unary (Default) .
0…n – Optional and multiple.
1…n – Mandatory and multiple.
————————————————
版权声明:本文为CSDN博主「iteye_7108」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/iteye_7108/article/details/82140453

reference-list

包含多个已注册服务的java.util.List

command
Environment
组件访问OSGi框架和Blueprint容器的权限

提供服务和使用服务

提供服务

src/main/resources目录下,添加OSGI-INF/blueprint两级目录,添加xml文件,命名随意(impl-blueprint.xml),也可以为多个,只要在此目录,均会被加载。

  1. 顶层元素blueprint
<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0"
           xmlns:odl="http://opendaylight.org/xmlns/blueprint/v1.0.0"
  odl:use-default-for-reference-types="true" >
</blueprint>
  • 1
  • 2
  • 3
  • 4
  1. service元素 发布服务到服务中心,声明服务属性 ref标识。要求使用java接口提供服务。
<service id="shape" interface="org.foo.shape.SimpleShape" ref="circle">
	<service-properties>
		<entry key="Simple.shape.name" value="Circle"/>
		<entry key="Simple.shape.icon">
			<bean class="org.foo.shape.circle.IconFactory"
			factory-method="createIcon"/>
		</entry>
	</service-properties>
</service>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  1. 引入工厂bean模式,指定factory-method,允许Blueprint通过构造函数创建对象,可作为服务、参数、服务属性。

  2. 服务接口,可以设置为service元素的一个属性interface,也可以使用interfaces元素(可导出多个)或者auto-export属性(属性值可为disabled、interfaces、class-hierarchy、all-classes)。

  3. MANIFEST.MF加入Bundle-Blueprint: OSGI-INF/blueprint/impl-blueprint.xml可以是路径、目录、模式*.xml

使用服务——代理

服务注入客户端

interface A class B class C class D声明依赖关系

B有setService方法,从服务注册中心注入一个A的实例到组件(set方法,引用注入)

<reference id="a" interface="A"/>
<bean id="b" ckass="B">
	<property name="service" ref="a"/>
</bean>
  • 1
  • 2
  • 3
  • 4

C有构造方法,服务A通过构造函数参数注入(构造函数,构造注入)

<reference id="a" interface="A"/>
<bean id="c" ckass="C">
	<argument ref="a"/>
</bean>
  • 1
  • 2
  • 3
  • 4

D希望聚合多个服务实例,setServices(List<A> list),通过一个代理列表注入聚合的OSGi服务

<reference-list id="a" interface="A"/>
<bean id="d" ckass="D">
	<property name="services" ref="a"/>
</bean>
  • 1
  • 2
  • 3
  • 4

监听器reference-listener,当服务在服务注册中心注册或注销时

<bean id="e" ckass="E"/>
<reference id="a" interface="A">
	<reference-listener
		bind-method="addService"
		unbind-method="removeService"
		ref="e"/>
</reference>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

环境管理器

将bundle上下文环境作为属性注入到WindowListener类

<bean id="listen" class="org.foo.WindowListener">
	<property name="bundleContext" ref="blueprintBundleContext" />
</bean>
  • 1
  • 2
  • 3

管理器值

<value>——根据文本字符直接构造对象
<ref>——相同Blueprint中,对顶级管理器的引用
<idref>——另一管理器的id
<map>——java.util.Map
<props>——java.util.Properties
<list>——java.util.List
<set>——java.util.Set
<array>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

三、Apache Felix

ONOS1.10源码使用了scr注解,参考apache-felix-maven-scr-plugin/scr-annotations

猜测,不一定对:使用scr注解,在pom.xml文件添加

            <plugin>
                <groupId>org.apache.felix</groupId>
                <artifactId>maven-bundle-plugin</artifactId>
            </plugin>
            <plugin>
                <groupId>org.apache.felix</groupId>
                <artifactId>maven-scr-plugin</artifactId>
            </plugin>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

后面再使用maven install/package的时候,会在/target/classes/OSGI-INF/路径下生成xml文件

<?xml version="1.0" encoding="UTF-8"?>
<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" immediate="true" name="org.onos.oneping.OnePing" activate="activate" deactivate="deactivate">
    <reference name="coreService" interface="org.onosproject.core.CoreService" cardinality="1..1" policy="static" bind="bindCoreService" unbind="unbindCoreService"/>
    <reference name="flowObjectiveService" interface="org.onosproject.net.flowobjective.FlowObjectiveService" cardinality="1..1" policy="static" bind="bindFlowObjectiveService" unbind="unbindFlowObjectiveService"/>
    <reference name="flowRuleService" interface="org.onosproject.net.flow.FlowRuleService" cardinality="1..1" policy="static" bind="bindFlowRuleService" unbind="unbindFlowRuleService"/>
    <reference name="packetService" interface="org.onosproject.net.packet.PacketService" cardinality="1..1" policy="static" bind="bindPacketService" unbind="unbindPacketService"/>
    <implementation class="org.onos.oneping.OnePing"/>
</scr:component>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小小林熬夜学编程/article/detail/112715
推荐阅读
  

闽ICP备14008679号