通常我在OSGi开发中看到一个服务绑定到另一个服务。但是我试图在非服务类中注入OSGi服务。
尝试实现的场景:我已经实现了一个MessageBusListener,这是一个OSGi服务,并绑定了几个更多的服务,如QueueExecutor等。
现在,MessageBusListener的任务之一是创建一个FlowListener(非服务类),它将根据消息内容调用流。此FlowListener需要像QueueExecutor这样的OSGi服务来调用流。
我尝试的方法之一是在从MessageBusListener创建FlowListener实例时传递服务的引用。但是,当参数化服务被停用并激活回来时,我认为OSGi服务会创建一个服务的新实例并绑定到MessageBusListener,但FlowListener仍然会有一个陈旧的引用。
@Component
public class MessageBusListener
{
private final AtomicReference<QueueExecutor> queueExecutor = new AtomicReference<>();
@Activate
protected void activate(Map<String, Object> osgiMap)
{
FlowListener f1 = new FlowListener(queueExeciutor)
}
Reference (service = QueueExecutor.class, cardinality = ReferenceCardinality.MANDATORY, policy = ReferencePolicy.STATIC)
protected void bindQueueExecutor(QueueExecutor queueExecutor)
{
this.queueExecutor = queueExecutor;
}
}
public class FlowListener
{
private final AtomicReference<QueueExecutor> queueExecutor;
FlowListener(QueueExecutor queueExecutor)
{
this.queueExecutor = queueExecutor;
}
queueExecutor.doSomething() *// This would fail in case the QueueExecutor
service was deactivated and activated again*
}
期待其他可满足我要求的方法。
答案 0 :(得分:1)
您的方法是正确的,您只需要在必要时处理停用。
如果QueueExecutor消失,MessageBuslistener将被关闭。您可以使用@Deactivate方法处理此问题。在此方法中,您还可以调用FlowListener的sutdown方法。
如果出现新的QeueExecutor服务,那么DS将创建一个新的MessageBuslistener,所以一切都应该没问题。
顺便说一下。你可以使用:
简单地注入QueueExecutor@Reference
QueueExecutor queueExecutor;