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,首先,也是最重要的是必须实现并发布此ManagedServiceAPI 作为目标 bundle 的服务。只要实现updated方法即可。不同的 ManagedServices 是由随服务注册的 SERVICE_PID 来区别的,因此对其配置进行更改时,就会触发相应的服务。
操作流程如下:
1.在资源管理器下建立一个保存properties的目录E:\osgi\configuration,目录结构如下将properties文件放在services下面
3.写一个实现ManagedService接口的实现类
public class SingleProperties implements ManagedService{
@Override
public 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 {
@Override
public 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