OSGi 系列(十四)之 Event Admin Service

2023-02-12,,,,

OSGi 系列十四)之 Event Admin Service

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

事件发布者使用 Event Admin 服务发送基于主题 (Topic) 的事件,任何对某一主题感兴趣的事件订阅者都会收到该事件,并且做出相应的反应。

1. Event Admin Service 介绍

(1) Event Admin Service 规范

compendium 规范提供了 Event Admin Service 服务,具体规范见 org.osgi.service.event

(2) Topic 的规范

/不能用于开头或者结尾
可以使用 A-Z,a-z,0-9,-,_

2. 快速入门

2.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>

2.2 新建 2 个 bundle,一个发布事件(osgi-event-publish),一个接收事件(osgi-event-subscribe)

2.3 发布事件(osgi-event-publish)

import java.util.HashMap;
import java.util.Map; import org.osgi.service.event.Event;
import org.osgi.service.event.EventAdmin; public class EventPublish { private EventAdmin eventAdmin; public void publish() {
Map<String, String> content = new HashMap<>();
content.put("phone", "10086");
content.put("content", "ye");
eventAdmin.postEvent(new Event("send/10086", content));
} public void setEventAdmin(EventAdmin eventAdmin) {
this.eventAdmin = eventAdmin;
}
}

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"
xsi:schemaLocation="http://www.osgi.org/xmlns/blueprint/v1.0.0 http://www.osgi.org/xmlns/blueprint/v1.0.0/blueprint.xsd"> <reference id="eventAdmin" interface="org.osgi.service.event.EventAdmin" /> <bean class="com.edu.osgi.event.publish.EventPublish" init-method="publish">
<property name="eventAdmin" ref="eventAdmin" />
</bean>
</blueprint>

2.4 接收事件(osgi-event-subscribe)

import org.osgi.service.event.Event;
import org.osgi.service.event.EventHandler; public class SendEventHandler implements EventHandler { public void handleEvent(Event event) {
System.out.println("=======handleEvent=======");
System.out.println(event.getTopic()); for(String key : event.getPropertyNames()) {
System.out.println(key + "=" + event.getProperty(key));
}
}
}

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"
xsi:schemaLocation="http://www.osgi.org/xmlns/blueprint/v1.0.0 http://www.osgi.org/xmlns/blueprint/v1.0.0/blueprint.xsd"> <service interface="org.osgi.service.event.EventHandler">
<service-properties>
<entry key="event.topics" value="send/*"/>
</service-properties>
<bean class="com.edu.osgi.event.subscribe.SendEventHandler" />
</service>
</blueprint>

2.5 karaf 测试

# 查看 EventAdmin 服务是否发布
ls EventAdmin
# 安装 eventadmin
feature:list | grep eventadmin
feature:install eventadmin

注意: osgi-event-subscribe 只能处理启动后发布的事件,不能处理启动前的事件。

3. 事件过滤

3.1 基于主题的过滤

<service interface="org.osgi.service.event.EventHandler">
<service-properties>
<entry key="event.topics" value="send/*"/>
</service-properties>
<bean class="com.edu.osgi.event.subscribe.SendEventHandler" />
</service>

3.2 基于内容的过滤

<service interface="org.osgi.service.event.EventHandler">
<service-properties>
<entry key="event.topics" value="send/*"/>
<entry key="event.filter" value="(phone=10010)"/>
</service-properties>
<bean class="com.edu.osgi.event.subscribe.SendEventHandler" />
</service>

OSGi 系列(十四)之 Event Admin Service的相关教程结束。

《OSGi 系列(十四)之 Event Admin Service.doc》

下载本文的Word格式文档,以方便收藏与打印。