我是OSGi技术的新手,我遇到了事件问题。我的应用程序等到下午6点,服务器包向客户端包发送消息。所以我做了一些研究,我发现它可以用EventAdmin完成:
注意:如果可以有代码示例,我会很高兴。
谢谢
答案 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。