我是OSGi技术的新手,在事件方面也有问题。我的应用程序等待到下午6:00,服务器包向客户端包发送消息。所以我做了一些研究,我发现这可以通过EventAdmin来完成:
注:如果可能有一个代码示例,我会很高兴的。
谢谢
发布于 2016-01-06 16:39:25
你可以找到样本
制片人:
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"));
}
}使用声明式服务引用服务跟踪器中的其他服务。
发布于 2016-01-04 10:44:45
您可以在OSGi enRoute服务目录中找到一个基本示例。
一个大量使用事件管理且基于时间的示例是OSGi enRoute示例中的OSGi enRoute示例调度程序。
关于如何添加它..。这取决于您的开发环境是什么。在bndtools中,这是非常容易的,如果您遵循OSGi enRoute快速启动教程,应该很清楚。
发布于 2016-09-19 06:01:05
由于您使用的是Eclipse3.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两种方法。您可以从EventAdmin获得BundleContext实例:
ServiceReference<EventAdmin> serviceReference = bundleContext.getServiceReference(EventAdmin.class);
EventAdmin eventAdmin = bundleContext.getService(serviceReference);EventAdmin的Equinox实现非常具体,我编写了一个简短的贴上那篇文章。
https://stackoverflow.com/questions/34584383
复制相似问题