org.osgi.service.event.EventHandler无法侦听EventAdmin服务发布的事件

时间:2012-11-02 15:55:20

标签: osgi equinox

我正在尝试为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捆绑包包含在运行配置中:

  1. org.eclipse.osgi
  2. org.eclipse.equinox.event
  3. org.eclipse.equinox.util
  4. org.eclipse.osgi.services
  5. 有人可以指出我错过了什么或做错了吗?或者,如果您有一些指向OSGi EventAdmin服务的工作示例的链接?

2 个答案:

答案 0 :(得分:1)

我猜想在发布商捆绑已经发布了事件后,您的侦听器包正在注册。

除非您控制捆绑包的启动顺序,否则在捆绑包的启动方法中对此进行测试很容易出错。我建议您在这个简单的测试中,在发布者中启动一个单独的线程,每隔几秒就发布一个事件。听众应该在注册后开始获取它们。

答案 1 :(得分:0)

确认您的侦听器包正在导入与EventAdmin包相同的org.osgi.service.event包。您的侦听器包可能包含org.osgi.service.event包,因此不使用与EventAdmin包相同的org.osgi.service.event包。这可能是EventAdmin包不会调用您的EventHandler服务的原因。它可能是别的东西,但这是要检查的东西。