我正在尝试为OSGi EventAdmin服务运行演示应用程序,但我实现的EventHandler无法监听EventAdmin发布者发布的事件:
下面是Event Publisher的代码,后面是Listener(EventHandler)的代码:
public class Publisher implements BundleActivator{
static EventAdmin eventAdmin;
ServiceReference ref;
static HashMap properties= null;
@Override
public void start(BundleContext context) throws Exception {
ref=context.getServiceReference(EventAdmin.class.getName());
if(ref==null){
System.err.println("Unable to aquire EventAdmin Ser Ref.");
}
eventAdmin=(EventAdmin) context.getService(ref);
if(eventAdmin==null){
System.err.println("unable to get service:EventAdmin");
}
properties=new HashMap();
properties.put("XYZ", "Test");
Event event = new Event("lnu/test/event/Demo", properties);
eventAdmin.postEvent(event);
System.out.println("event posted");
}
@Override
public void stop(BundleContext context) throws Exception {
// TODO Auto-generated method stub
}
}
监听器代码:
public class Listener implements BundleActivator, EventHandler {
public void start(BundleContext context) {
Dictionary d = new Hashtable();
d.put(EventConstants.EVENT_TOPIC, "lnu/test/event/Demo" );
context.registerService( EventHandler.class.getName(),
this, d );
System.out.println("event handler is registered now");
}
public void stop( BundleContext context) {}
public void handleEvent(Event event ) {
System.err.println("Event has been captured");
System.out.println("getTopic: "+event.getTopic());
System.out.println("getproperty: "+event.getProperty("XYZ"));
}
}
代码中的print语句显示事件已由发布者发布,并且Listener已向EventHandler服务注册,但仍然不会在侦听器端调用handleEvent方法,我不知道为什么?并且无法理解幕后发生的事情。没有运行时异常/错误。
使用的IDE是Eclipse Juno Build id:20120614-1722 with Equinox。
以下Target Platform捆绑包包含在运行配置中:
有人可以指出我错过了什么或做错了吗?或者,如果您有一些指向OSGi EventAdmin服务的工作示例的链接?
答案 0 :(得分:1)
我猜想在发布商捆绑已经发布了事件后,您的侦听器包正在注册。
除非您控制捆绑包的启动顺序,否则在捆绑包的启动方法中对此进行测试很容易出错。我建议您在这个简单的测试中,在发布者中启动一个单独的线程,每隔几秒就发布一个事件。听众应该在注册后开始获取它们。
答案 1 :(得分:0)
确认您的侦听器包正在导入与EventAdmin包相同的org.osgi.service.event包。您的侦听器包可能包含org.osgi.service.event包,因此不使用与EventAdmin包相同的org.osgi.service.event包。这可能是EventAdmin包不会调用您的EventHandler服务的原因。它可能是别的东西,但这是要检查的东西。