OSGi 系列(十三)之 Configuration Admin Service

OSGi 的 CM 就是 Configuration Admin Service,是用于管理 Bundle 属性、并在属性发生变更时通知相应的 Service,这是保持 OSGi 动态性的很关键的一个服务。

1. ConfigurationAdmin

用于管理配置数据的服务,主要有两个作用:

  • 获取配置数据
  • 更新配置数据
public class ConfigurationAdminDemo {
private ConfigurationAdmin configurationAdmin; public void init() {
try {
Configuration conf = configurationAdmin.getConfiguration("jdbc.mysql");
Dictionary<String, Object> dict = conf.getProperties();
System.out.println(dict); Dictionary<String, String> properties = new Hashtable<>();
properties.put("username", "root");
properties.put("password", "123456");
conf.update(properties);
} catch (IOException e) {
e.printStackTrace();
}
} public ConfigurationAdmin getConfigurationAdmin() {
return configurationAdmin;
} public void setConfigurationAdmin(ConfigurationAdmin configurationAdmin) {
this.configurationAdmin = configurationAdmin;
}
}

blueprint.xml 配制文件:

<reference id="configurationAdmin" interface="org.osgi.service.cm.ConfigurationAdmin" />
<bean class="com.edu.osgi.cm.ConfigurationAdminDemo" init-method="init">
<property name="configurationAdmin" ref="configurationAdmin" />
</bean>

结果如下:

2. ManagedService

用来关联和操作单个配置文件的服务当相关联的配置文件发生变化的时候,会通知到相应的服务。

public class DBConfigManagedService implements ManagedService {
public void updated(Dictionary<String, ?> properties) throws ConfigurationException {
System.out.println("======updated======");
System.out.println(properties);
}
}

blueprint.xml 配制文件:

<service interface="org.osgi.service.cm.ManagedService">
<service-properties>
<entry key="service.pid" value="jdbc.mysql" />
</service-properties>
<bean class="com.edu.osgi.cm.DBConfigManagedService" />
</service>

手动修改 jdbc.mysql.cfg 文件后,结果如下:

3. blueprint 中 cm 的使用

<?xml version="1.0" encoding="UTF-8"?>
<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:cm="http://aries.apache.org/blueprint/xmlns/blueprint-cm/v1.1.0"
xsi:schemaLocation="http://www.osgi.org/xmlns/blueprint/v1.0.0 http://www.osgi.org/xmlns/blueprint/v1.0.0/blueprint.xsd
http://aries.apache.org/blueprint/xmlns/blueprint-cm/v1.1.0 http://aries.apache.org/schemas/blueprint-cm/blueprint-cm-1.1.0.xsd"> <cm:property-placeholder persistent-id="jdbc.mysql.conf" update-strategy="reload"/>
<bean class="com.edu.osgi.cm.MysqlConfig" init-method="display">
<property name="className" value="${className}" />
<property name="url" value="${url}" />
<property name="username" value="${username}" />
<property name="password" value="${password}" />
</bean>
</blueprint>

4. karaf 中 cm 命令

  • config:list "(service.pid=jdbc.mysql)" 列出 jdbc.mysql 配制文件

  • config:edit 编辑属性

    config:edit jdbc.mysql
    config:property-set name join
    config:update

5. ManagedServiceFactory

用来关联和操作多个配置文件的服务,当多个相关联的配置文件发生变化的时候,都会通知到相应的服务。

(1) 环境准备

<dependency>
<groupId>org.osgi</groupId>
<artifactId>org.osgi.core</artifactId>
<version>5.0.0</version>
</dependency>
<dependency>
<groupId>org.osgi</groupId>
<artifactId>org.osgi.compendium</artifactId>
<version>5.0.0</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-dbcp2</artifactId>
<version>2.1.1</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.38</version>
</dependency>

(2) 实现 ManagedServiceFactory 接口

public class DataSourceServiceFactory implements ManagedServiceFactory {

    private BundleContext bundleContext;
private Map<String, ServiceRegistration<?>> serviceMap = new ConcurrentHashMap<>(); public String getName() {
return "DataSourceServiceFactory";
} // 更新配置文件
public void updated(String pid, Dictionary<String, ?> properties) throws ConfigurationException {
System.out.println("============updated============");
System.out.println(pid);
System.out.println(properties);
BasicDataSource bds = new BasicDataSource();
bds.setDriverClassName(properties.get("driverClassName").toString());
bds.setUrl(properties.get("url").toString());
bds.setUsername(properties.get("username").toString());
bds.setPassword(properties.get("password").toString()); Dictionary<String, String> props = new Hashtable<>();
props.put("instance", properties.get("instance").toString()); ServiceRegistration<?> sr = bundleContext.registerService(DataSource.class.getName(), bds, props);
System.out.println("------------");
serviceMap.put(pid, sr);
} // 删除配置文件
public void deleted(String pid) {
System.out.println("============deleted============");
System.out.println(pid);
ServiceRegistration<?> sr = serviceMap.get(pid);
sr.unregister();
serviceMap.remove(pid);
} public void setBundleContext(BundleContext bundleContext) {
this.bundleContext = bundleContext;
}
}

(3) blueprint.xml

<?xml version="1.0" encoding="UTF-8"?>
<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:cm="http://aries.apache.org/blueprint/xmlns/blueprint-cm/v1.1.0"
xsi:schemaLocation="http://www.osgi.org/xmlns/blueprint/v1.0.0 http://www.osgi.org/xmlns/blueprint/v1.0.0/blueprint.xsd
http://aries.apache.org/blueprint/xmlns/blueprint-cm/v1.1.0 http://aries.apache.org/schemas/blueprint-cm/blueprint-cm-1.1.0.xsd"> <service interface="org.osgi.service.cm.ManagedServiceFactory">
<service-properties>
<entry key="service.pid" value="jdbc.datasource"/>
</service-properties>
<bean class="com.edu.osgi.cm.DataSourceServiceFactory">
<property name="bundleContext" ref="blueprintBundleContext" />
</bean>
</service> <!--<reference interface="javax.sql.DataSource" filter="(instance=test)"/>-->
</blueprint>

(4) 测试

# 安装事务
feature:install transaction
install -s mvn:org.apache.commons/commons-pool2/2.4.2
install -s mvn:org.apache.commons/commons-dbcp2/2.1.1
install -s mvn:mysql/mysql-connector-java/5.1.18

在 deploy 目录下新建二个文件 jdbc.datasource-dev.cfg、jdbc.datasource-test.cfg(注意:文件要以 jdbc.datasource 开头,"-" 分隔)

jdbc.datasource-dev.cfg

instance=dev
driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql:///dev
username=root
password=root

jdbc.datasource-test.cfg

instance=test
driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql:///test
username=root
password=root

OSGi 系列(十三)之 Configuration Admin Service的更多相关文章

  1. OSGi 系列(十四)之 Event Admin Service

    OSGi 系列(十四)之 Event Admin Service OSGi 的 Event Admin 服务规范提供了开发者基于发布/订阅模型,通过事件机制实现 Bundle 间协作的标准通讯方式. ...

  2. OSGi 系列(十二)之 Http Service

    OSGi 系列(十二)之 Http Service 1. 原始的 HttpService (1) 新建 web-osgi 工程,目录结构如下: (2) HomeServlet package com. ...

  3. OSGi 系列(十六)之 JDBC Service

    OSGi 系列(十六)之 JDBC Service compendium 规范提供了 org.osgi.service.jdbc.DataSourceFactory 服务 1. 快速入门 1.1 环境 ...

  4. OSGi 系列(六)之服务的使用

    OSGi 系列(六)之服务的使用 1. 为什么使用服务 降低服务提供者和服务使用者直接的耦合,这样更容易重用组件 隐藏了服务的实现细节 支持多个服务的实现.这样你可以互换这实现 2. 服务的使用 2. ...

  5. OSGi 系列(一)之什么是 OSGi :Java 语言的动态模块系统

    OSGi 系列(一)之什么是 OSGi :Java 语言的动态模块系统 OSGi 的核心:模块化.动态.基于 OSGi 就可以模块化的开发 java 应用,模块化的部署 java 应用,还可以动态管理 ...

  6. OSGi 系列(十八)之 基于注解的 Blueprint

    OSGi 系列(十八)之 基于注解的 Blueprint 1. 注解实现 blueprint 第一步:bundle 添加 Bundle-Blueprint-Annotation <plugin& ...

  7. OSGi 系列(三)之 bundle 详解

    OSGi 系列(三)之 bundle 详解 1. 什么是 bundle bundle 是以 jar 包形式存在的一个模块化物理单元,里面包含了代码,资源文件和元数据(metadata),并且 jar ...

  8. OSGi 系列(十)之 Blueprint

    OSGi 系列(十)之 Blueprint blueprint 是 OSGi 的一个规范,类似于 spring 的 IOC,用来处理 OSGi 的动态特性,可以大大简化服务的使用. blueprint ...

  9. OSGi 系列(七)之服务的监听、跟踪、声明等

    OSGi 系列(七)之服务的监听.跟踪.声明等 1. OSGi 服务的事件监听 和 bundle 的事件监听类似,服务的事件监听是在服务注册.注销,属性被修改的时候,OSGi 框架会发出各种不同的事件 ...

随机推荐

  1. angularjs探秘<一>认识angularjs

    首先聊聊angularjs是啥. 首先AngularJS 是一个 JavaScript 框架.(PS:其实就是外部引用的js文件) 所以AngularJS的使用依然是外部引用js文件. 附上引用地址 ...

  2. jquery 隐藏 显示 动画效果

    <!DOCTYPE html> <html> <head> <script src="/jquery/jquery-1.11.1.min.js&qu ...

  3. Excel 返回第2大的值

  4. ABAP-关于COMMIT WORK 和COMMIT WORK AND WAIT

    转载:https://blog.csdn.net/champaignwolf/article/details/6925019 首先说明一点:更新是异步的,更新是由SAP中UPD1和UPD2两个进程执行 ...

  5. UI5-文档-4.29-Integration Test with OPA

    如果我们想测试我们的应用程序的交互模式或更多的可视化特性,我们也可以编写一个集成测试. 我们还没有想过测试我们与app的交互,所以在这一步中,我们将在点击“Say Hello with dialog” ...

  6. Java Socket通信实例

    一.简单的客户端与服务器一对一连接: Socket通信的步骤: 1.创建ServerSocket和Socket 2.打开连接到Scket的输入/输出流 3.按照协议对Socket进行读/写操作 4.关 ...

  7. python限制函数执行时间

    from:https://stackoverflow.com/questions/366682/how-to-limit-execution-time-of-a-function-call-in-py ...

  8. 一本很好的书LearnOpenGL

    这本书好像不怎么出名,但读起来非常易懂,知识全面 https://learnopengl.com/Advanced-Lighting/Normal-Mapping 基于物理的渲染 – 理论篇 < ...

  9. drop user和drop user cascade的区别

    SQL> delete user itp2;delete user itp2       *第 1 行出现错误:ORA-00903: 表名无效 SQL> drop user itp2;dr ...

  10. Hibernate merge和update的区别

    今天做了个测试,写了个测试用例来看看merge与update时控制台打印出来的日志有什么不一样.实体bean很简单,就id和name两个字段,接下来分别给出以下几种测试情形的控制台日志内容: 1. 数 ...