osgi 学习系列(八)osgi读取properties文件

来源:互联网 发布:mcmore商城系统源码 编辑:程序博客网 时间:2024/05/15 23:49

OSGi的CM就是Configuration Admin Service,是用于管理Bundle属性、并在属性发生变更时通知相应的Service,这是保持OSGi动态性的很关键的一个服务,毕竟配置属性的修改是会发生的,但又不希望修改这些属性后需要重启才能生效,CM对于属性的存储是根据服务注册时提供的service.pid的值(必须是唯一的)以及Bundle Location(Bundle的地址)构成key来存储其属性的,按照这样的过程,在维护属性时自然也要以这个为Key来进行操作,在通知属性更新时CM也是根据这个key的值来决定的,但实现ManagedService的服务只能传入service.pid这个值,Bundle Location的值CM将自动的获取该服务所属的Bundle的Location

 

要使用 Configuration Admin Service,首先,也是最重要的是必须实现并发布此 ManagedService API 作为目标 bundle 的服务。只要实现 updated 方法即可。不同的 ManagedServices 是由随服务注册的 SERVICE_PID 来区别的,因此对其配置进行更改时,就会触发相应的服务。


操作流程如下:

1.在资源管理器下建立一个保存properties的目录E:\osgi\configuration,目录结构如下


将properties文件放在services下面


2.在runtime环境中配置运行环境,让运行时能够找到属性文件,这里的路径需要根据第一步中configuration存放的路径修改



3.写一个实现ManagedService接口的实现类

public class SingleProperties implements ManagedService{@Overridepublic void updated(Dictionary dict) throws ConfigurationException {if(dict!=null){System.out.println("read configuration properties......");System.out.println("name : " + dict.get("name"));System.out.println("blood : " + dict.get("blood"));System.out.println("mana : " + dict.get("mana"));}else {System.out.println("read configuration properties fail!");}}}


4.发布ManagedService服务并设置component properties:service.pid



5.设置bundle启动顺序,configmanager要在cm启动后启动,否则会报错


执行后如下



上面说的是一个bundle读取一个properties文件,如果多个bundle共同用一个properties文件,需要创建一个专门读取properties文件的bundle,用一个类存属性,让后导出该类的包,需要用properties文件的bundle导入这个包即可,代码如下

public class PropertyConstants {public static String NAME;public static int BLOOD;public static int MANA;}

public class PropertiesManagement implements ManagedService {@Overridepublic void updated(Dictionary dict) throws ConfigurationException {if(dict!=null){System.out.println("read configuration properties......");PropertyConstants.NAME = (String)dict.get("name");PropertyConstants.BLOOD = Integer.parseInt((String)dict.get("blood"));PropertyConstants.MANA = Integer.parseInt((String)dict.get("mana"));}else {System.out.println("read configuration properties fail!");}}}


上一章数据库连接是在配置文件里写死的,前面介绍了读properties文件,现在就说下怎么读properties文件配置数据库连接。配置文件同样放在services文件夹下,在spring配置文件的namespace中加入


Osgi:cm会自动根据

<osgix:cm-properties id="db_properties" persistent-id="com.ferry.jdbc"></osgix:cm-properties><ctx:property-placeholder properties-ref="db_properties" />

配置来加载properties文件中的数据库连接配置,其中

persistent-id="com.ferry.jdbc"中com.ferry.jdbc为properties文件的文件名


spring配置文件修改部分如下

<property name="driverClass"><value>${jdbc.driverClass}</value></property><property name="jdbcUrl"><value>${jdbc.jdbcUrl}</value></property><property name="user"><value>${jdbc.user}</value></property><property name="password"><value>${jdbc.password}</value></property>



用到的jar包,在上一章的基础上增加如下包

org.eclipse.equinox.cm_1.0.300.v20110502.jar

pax-confman-propsloader-0.2.2.jar

点击下载demo代码

原创粉丝点击