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 环境准备
org.osgi
org.osgi.core
5.0.0
org.osgi
org.osgi.compendium
5.0.0
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 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 配制
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">
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 配制
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">
2.5 karaf 测试
# 查看 EventAdmin 服务是否发布
ls EventAdmin
# 安装 eventadmin
feature:list | grep eventadmin
feature:install eventadmin
注意: osgi-event-subscribe 只能处理启动后发布的事件,不能处理启动前的事件。
3. 事件过滤
3.1 基于主题的过滤
3.2 基于内容的过滤