首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >OSGi EventAdmin

OSGi EventAdmin
EN

Stack Overflow用户
提问于 2016-01-04 03:41:48
回答 3查看 2.6K关注 0票数 3

我是OSGi技术的新手,在事件方面也有问题。我的应用程序等待到下午6:00,服务器包向客户端包发送消息。所以我做了一些研究,我发现这可以通过EventAdmin来完成:

  1. 如何将EventAdmin添加到Eclipse (我使用的是Eclipse3.8.1 ubuntu)?
  2. 如何使用EventAdmin?
  3. 如果可能的话,如何与事件一起发送数据?

注:如果可能有一个代码示例,我会很高兴的。

谢谢

EN

回答 3

Stack Overflow用户

发布于 2016-01-06 16:39:25

你可以找到样本

制片人:

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

代码语言:javascript
复制
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

代码语言:javascript
复制
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"));
    }
}

使用声明式服务引用服务跟踪器中的其他服务。

票数 3
EN

Stack Overflow用户

发布于 2016-01-04 10:44:45

您可以在OSGi enRoute服务目录中找到一个基本示例。

一个大量使用事件管理且基于时间的示例是OSGi enRoute示例中的OSGi enRoute示例调度程序。

关于如何添加它..。这取决于您的开发环境是什么。在bndtools中,这是非常容易的,如果您遵循OSGi enRoute快速启动教程,应该很清楚。

票数 2
EN

Stack Overflow用户

发布于 2016-09-19 06:01:05

由于您使用的是Eclipse3.8.1,不支持依赖项注入,因此可以使用以下代码。

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

代码语言:javascript
复制
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两种方法。您可以从EventAdmin获得BundleContext实例:

代码语言:javascript
复制
ServiceReference<EventAdmin> serviceReference = bundleContext.getServiceReference(EventAdmin.class);
EventAdmin eventAdmin = bundleContext.getService(serviceReference);

EventAdmin的Equinox实现非常具体,我编写了一个简短的贴上那篇文章

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34584383

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档