OSGi EventAdmin

时间:2016-01-04 03:41:48

标签: osgi osgi-bundle

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

  1. 如何将EventAdmin添加到Eclipse(我使用eclipse 3.8.1 ubuntu)?
  2. 如何使用EventAdmin?
  3. 如果可能,我如何发送数据?
  4. 注意:如果可以有代码示例,我会很高兴。

    谢谢

3 个答案:

答案 0 :(得分:3)

您可以找到

的样本

制片:

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"));
    }
}

使用声明性服务来引用服务跟踪器中的其他服务

答案 1 :(得分:2)

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

大量使用事件管理员且基于时间的示例是OSGi enRoute examples

中的enRoute调度程序

关于如何添加它......这取决于您的开发环境。在bndtools中,这很容易,如果你遵循OSGi enRoute Quick Start tutorial

,应该很清楚

答案 2 :(得分:0)

当您使用没有依赖注入支持的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。 这个接口为我们提供了两个方法sendEvent用于同步发送,postEvent用于异步发送。 您可以从BundleContext获取EventAdmin实例:

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

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