1.使用事件管理服务 EventAdmin
前面讲过,OSGi 规范定义了很多可用的 bundle,您尽管使用它们完成您的工作,而不必另外再发明轮子,OSGi 框架定义的事件管理服务,类似于 JMS,但是使用上比 JMS 简单。
OSGi 整个框架都离不开这个服务 ,因为框架里面全都依靠事件机制进行通信,例如 bundle 的启动、停止,框架的启动、停止,服务的注册、注销等等等等都是会发布事件给监听者,同时也在监听其它模块发来的自己关心的事件。 OSGi 框架的事件机制主要核心思想是:
- 用户(程序员)可以自己按照接口定义自己的事件类型
- 用户可以监听自己关心的事件或者所有事件
- 用户可以将事件同步的或者异步的提交给框架,由框架负责同步的或者异步的分发给监听者
说明:框架提供的事件服务、事件提供者、事件监听者之间的关系如下:
图 18. 事件服务、事件提供者、事件监听者之间的关系
事件提供者 Publisher 可以获取 EventAdmin 服务,通过 sendEvent 同步(postEvent 异步)方式提交事件,EventAdmin 服务负责分发给相关的监听者 EventHandler,调用它们的 handleEvent
方法。
这里要介绍一个新的概念 Topics,其实在 JMS 里面也有用,也就是说一个事件一般都有一个主题,这样我们的事件接收者才能按照一定的主题进行过滤处理,例如只处理自己关心的主题的事件,一般情况下主题是用类似于 Java Package 的命名方式命名的。
同步提交(sendEvent)和异步提交(postEvent) 事件的区别是,同步事件提交后,等框架分发事件给所有事件接收者之后才返回给事件提交者,而异步事件则一经提交就返回了,分发在另外的线程进行处理。
2.实现步骤:
1.自定义一个事件:
import java.util.Dictionary;
import org.osgi.service.event.Event;
public class MyEvent extends Event {
public static final String MY_TOPIC = "osgi/test/helloworld/MyEvent";
public MyEvent(String arg0, Dictionary arg1) {
super(MY_TOPIC, arg1);
}
public MyEvent() {
super(MY_TOPIC, null);
}
public String toString() {
return "MyEvent";
}
}
2.注册事件服务:
import org.osgi.framework.BundleContext;
import org.osgi.framework.ServiceReference;
import org.osgi.service.event.EventAdmin;
@Override
public String getHello() {
//post a event
ServiceReference ref =
context.getServiceReference(EventAdmin.class.getName());
if(ref!=null) {
eventAdmin = (EventAdmin)context.getService(ref);
if(eventAdmin!=null) {
System.out.println("post event started");
eventAdmin.postEvent(new MyEvent());
System.out.println("post event returned");
}
}
return "Hello osgi,service";
}
3.实现一个事件监听:
import org.osgi.service.event.Event;
import org.osgi.service.event.EventHandler;
public class MyEventHandler implements EventHandler {
@Override
public void handleEvent(Event event) {
System.out.println("handle event started--"+event);
try {
Thread.currentThread().sleep(5*1000);
} catch (InterruptedException e) {
}
System.out.println("handle event ok--"+event);
}
}
4.注册监听器:
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;
import java.util.Hashtable;
import org.osgi.framework.BundleActivator;
import org.osgi.framework.BundleContext;
import org.osgi.service.event.EventConstants;
import org.osgi.service.event.EventHandler;
import osgi.test.helloworld.event.MyEvent;
import osgi.test.helloworld.service.IAppService;
import osgi.test.helloworld.service.IHello;
public void start(BundleContext context) throws Exception {
System.out.println("hello world2");
/**
* 添加事件处理器 .
*/
String[] topics = new String[] {MyEvent.MY_TOPIC};
Hashtable<String,String[]> ht = new Hashtable<String,String[]>();
ht.put(EventConstants.EVENT_TOPIC, topics);
EventHandler myHandler = new MyEventHandler();
context.registerService(
EventHandler.class.getName(),
myHandler,
ht);
System.out.println("event handler registered");
/**
* Test hello service from bundle1.
*/
IHello hello1 =
(IHello) context.getService(
context.getServiceReference(IHello.class.getName()));
System.out.println(hello1.getHello());
}
备注:上述服务的注册和获取跟上一章类似,不同的是eclipse提供的事件服务的实现相对来说复杂点。另外,EventConstants.EVENT_TOPIC用来描述事件的主题,一个事件一般都有一个主题,这样我们的事件接收者才能按照一定的主题进行过滤处理,例如只处理自己关心的主题的事件,一般情况下主题是用类似于 Java Package 的命名方式命名的。
分享到:
相关推荐
赠送jar包:osgi-resource-locator-1.0.1.jar; 赠送原API文档:osgi-resource-locator-1.0.1-javadoc.jar; 赠送源代码:osgi-resource-locator-1.0.1-sources.jar; 赠送Maven依赖信息文件:osgi-resource-locator...
Spring OSGi是Spring框架与OSGi(开放服务网关倡议)技术的结合,它为开发者提供了在OSGi环境中使用Spring的能力。OSGi是一种Java模块化系统,旨在解决大型软件系统的复杂性问题,而Spring OSGi则将Spring的依赖注入...
赠送jar包:osgi-resource-locator-1.0.1.jar; 赠送原API文档:osgi-resource-locator-1.0.1-javadoc.jar; 赠送源代码:osgi-resource-locator-1.0.1-sources.jar; 赠送Maven依赖信息文件:osgi-resource-locator...
spring-osgi-1.2.1-with-dependencies.zip spring-osgi-1.2.1-with-dependencies.zip spring-osgi-1.2.1-with-dependencies.zip
在“org.eclipse.osgi-3.7.2”中,主要包含实现OSGi运行时环境所需的类库和服务,如启动、管理bundle的生命周期、处理bundle间的依赖关系等。 在Eclipse OSGi框架下,每个bundle都有自己的类加载器,这使得bundle...
1. **依赖管理**:在OSGi中,每个Bundle声明其依赖的服务和库,框架负责解析并提供这些依赖。如果某个依赖不可用,Bundle将不会被激活,避免了运行时的类加载问题。 2. **版本管理**:OSGi支持多个版本的同一服务...
【描述】描述中的"org.eclipse.osgi-3.7.0"同样指代了Eclipse OSGi的核心实现库,它包含了运行时环境、服务和工具,使得开发者可以利用OSGi规范构建和部署可扩展的、动态的Java应用。 【标签】"eclipse osgi" 暗示...
它允许开发者使用Spring的XML配置或者基于注解的方式来定义和管理Bean,同时,这些Bean能够在OSGi环境中被正确地激活、销毁和更新,确保了服务生命周期的管理。 再者,Spring OSGi提供了事件模型,使得组件之间可以...
例如,`org.eclipse.osgi.framework.internal.core.BundleHost`类负责管理bundle的启动和停止,`org.eclipse.osgi.framework.eventmgr.EventAdmin`则展示了OSGi事件模型的实现。 五、应用场景 OSGi在许多领域有着...
《Carrot-OSGi-Annotation-SCR-Make:探索开源项目的OSGI服务组件构建》 在软件开发领域,OSGi(Open Services Gateway Initiative)是一种模块化系统和Java应用程序框架,它使得开发者能够创建可独立更新和重用的...
OSGI(Open Services Gateway Initiative)是一种模块化系统和Java服务框架,它允许应用程序由一系列可独立更新和替换的模块组成,这些模块称为“bundle”。在本实例中,我们将探讨如何利用OSGI技术来开发Eclipse...
【标题】"killbill-osgi-bundles-lib-slf4j-osgi-0.8.4.zip" 是一个基于OSGi的 Kill Bill 库,其中包含了SLF4J(Simple Logging Facade for Java)的OSGi兼容版本。SLF4J是一个为各种日志框架提供简单抽象的接口,...
标题 "org.eclipse.osgi-3.8.0" 指的是 Eclipse OSGi 框架的一个特定版本,3.8.0。OSGi(Open Service Gateway Initiative)是一种Java模块化系统,它允许开发人员将应用程序分解为独立的、可管理的组件,这些组件...
3. 带有OSGi的语义版本管理:OSGi采用语义版本控制,它不仅关注数字的递增,而且表达版本之间的兼容性,如MAJOR、MINOR和MICRO三个部分的版本号。 4. MANIFEST.MF文件:在OSGi模块中,包含一个被称为MANIFEST.MF的...
spring-osgi-1.2.0-with-dependencies.zip spring-osgi-1.2.0-with-dependencies.zip spring-osgi-1.2.0-with-dependencies.zip
OSGi(Open Services Gateway Initiative)是一种开放标准的Java模块化系统,它允许开发人员将应用程序分解为一组可独立更新和管理的小型服务组件。在"OSGi -- Helloworld 学习记录一"这篇博文中,作者很可能是分享...
它包含一个框架,用于管理软件的生命周期,以及一系列服务,用于支持复杂的运行时需求,比如安全、跟踪、事件管理等。 在Eclipse-OSGi框架中,基本的概念单元是Bundle。Bundle是封装了一组相关的功能和资源的Java包...
其次,"OSGi服务文档"深入探讨了OSGI框架内的各种服务,如配置管理服务、包服务、事件服务、HTTP服务等。配置管理服务允许动态地更新bundle的配置信息,适应运行时环境的变化。包服务提供了对bundle间依赖关系的管理...