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

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{

	@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

点击下载demo代码

  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值