OSGi 的 Event Admin 服务规范提供了开发者基于发布 / 订阅模型,通过事件机制实现 Bundle 间协作的标准通讯方式。
事件发布者使用 Event Admin 服务发送基于主题 (Topic) 的事件,任何对某一主题感兴趣的事件订阅者都会收到该事件,并且做出相应的反应。
如何发布事件
我们遵循以下的步骤,通过 Event Admin 发布事件:
获得实现了 org.osgi.service.event.EventAdmin 接口的 Event Admin 服务引用。
拟定事件的主题。
指定事件所携带的 key/value 属性集。
使用 Event Admin 提供的 postEvent 或者 sendEvent 方法发布事件,postEvent 使用同步的方式发布事件,即:等到所有的事件订阅者响应了该事件,方法调用返回,而 sendEvent 使用异步的方式发布事件。
发布事件:
/**
* 自定义Bundle(服务)实现类,并且将事件发送到EventAdmin中
* @author zxpWork
*
*/
public class HelloWordImpl implements HelloWord {
public String getHello() {
BundleContext context=Activator.contet;
ServiceReference ref =context.getServiceReference(EventAdmin.class.getName()); //获取EventAdmin服务
if(null!=ref){
EventAdmin eventAdmin = (EventAdmin)context.getService(context.getServiceReference(EventAdmin.class.getName()));
if(eventAdmin!=null) {
System.out.println("event started");
// eventAdmin.postEvent(new MyEvent()); //异步 :发送事件,不管监听方是否接收成功直接返回。
eventAdmin.sendEvent(new MyEvent());//同步 :发送事件,需要所有监听方正常接收成功