【问题标题】:OSGi EventAdminOSGi 事件管理
【发布时间】:2016-01-04 03:41:48
【问题描述】:

我是 OSGi 技术的新手,但我对事件有疑问。我的应用程序一直等到下午 6:00,服务器包向客户端包发送一条消息。所以我做了一些研究,发现可以用 EventAdmin 完成:

  1. 如何将 EventAdmin 添加到 Eclipse(我使用的是 eclipse 3.8.1 ubuntu)?
  2. 如何使用 EventAdmin?
  3. 如果可能,我如何发送事件数据?

注意:如果可以提供代码示例,我会很高兴。

谢谢

【问题讨论】:

    标签: osgi osgi-bundle


    【解决方案1】:

    你可以找到样本

    制作人:

    https://github.com/robertcsakany/welcometoosgi/tree/master/hu.blackbelt.welcometoosgi.eventproducer

    import org.apache.felix.scr.annotations.*;
    import org.apache.felix.scr.annotations.Component;
    import org.osgi.service.component.ComponentContext;
    import org.osgi.service.event.Event;
    import org.osgi.service.event.EventAdmin;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    
    import java.util.Dictionary;
    import java.util.Hashtable;
    
    @Component(metatype = true, immediate = true)
    @Properties(value = {
            @Property(name = "fooBar", value = "bar")
    })
    public class EventProducer {
    
        Logger log = LoggerFactory.getLogger(EventProducer.class);
    
        private String foo = "";
    
        @Reference
        EventAdmin eventAdmin;
    
        @Activate
        public void activate(ComponentContext context) {
            Dictionary properties = new Hashtable();
            properties.put("test", context.getProperties().get("fooBar"));
            Event generatedEvent = new Event("test/event/GENERATED", properties);
            log.info("Sending event");
            eventAdmin.sendEvent(generatedEvent);
        }
    }
    

    对于消费者:

    https://github.com/robertcsakany/welcometoosgi/tree/master/hu.blackbelt.welcometoosgi.eventconsumer

    import org.apache.felix.scr.annotations.*;
    import org.apache.felix.scr.annotations.Component;
    import org.osgi.service.event.Event;
    import org.osgi.service.event.EventConstants;
    import org.osgi.service.event.EventHandler;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    
    
    @Component(metatype = true, immediate = true)
    @Service
    @Properties(value = {
            @Property(name = EventConstants.EVENT_TOPIC, value = {"test/event/GENERATED"})
    })
    public class EventConsumer implements EventHandler {
    
        Logger log = LoggerFactory.getLogger(EventConsumer.class);
    
        private String foo = "";
    
        @Override
        public void handleEvent(Event event) {
            log.info("Event catched - "+event.getTopic());
            log.info("Event property - "+event.getProperty("test"));
        }
    }
    

    那是使用声明式服务来引用来自服务跟踪器的其他服务

    【讨论】:

      【解决方案2】:

      您可以在OSGi enRoute service catalog 中找到一个基本示例。

      一个大量使用 Event Admin 并且基于时间的示例是 OSGi enRoute examples 中的 enRoute 调度程序

      关于如何添加它......这取决于你的开发环境是什么。在 bndtools 中,这很容易,如果您按照 OSGi enRoute Quick Start tutorial 进行操作,应该很清楚

      【讨论】:

      • 第一个和第三个链接失效了:(
      【解决方案3】:

      由于您使用的是不支持依赖注入的 eclipse 3.8.1,您可以使用以下代码。

      事件监听。 实现 org.osgi.service.event.EventHandler 接口来处理事件。 在 BundleContext 中注册你的监听器。 javadoc中有一个例子:

      String[] topics = new String[{EventConstants.EVENT_TOPIC,«com/sample_topic»};
      Hashtable ht = new Hashtable();
      ht.put(EVENT_TOPIC, topics);
      context.registerService(EventHandler.class.getName(), this, ht);
      

      事件发送。 EventAdmin 实例可用于发送事件。详情请见javadoc。 该接口为我们提供了 2 个方法 sendEvent 用于同步发送和 postEvent 用于异步发送。 您可以从 BundleContext 获取 EventAdmin 实例:

      ServiceReference<EventAdmin> serviceReference = bundleContext.getServiceReference(EventAdmin.class);
      EventAdmin eventAdmin = bundleContext.getService(serviceReference);
      

      EventAdmin 的 Equinox 实现非常具体,我写了一个简短的 post about that

      【讨论】:

        猜你喜欢
        • 2014-02-22
        • 1970-01-01
        • 2011-08-26
        • 2014-12-13
        • 2013-11-08
        • 2017-05-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多