在非组件类中注入OSGi服务

时间:2018-04-09 16:11:15

标签: dependency-injection osgi

通常我在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*
}

期待其他可满足我要求的方法。

1 个答案:

答案 0 :(得分:1)

您的方法是正确的,您只需要在必要时处理停用。

如果QueueExecutor消失,MessageBuslistener将被关闭。您可以使用@Deactivate方法处理此问题。在此方法中,您还可以调用FlowListener的sutdown方法。

如果出现新的QeueExecutor服务,那么DS将创建一个新的MessageBuslistener,所以一切都应该没问题。

顺便说一下。你可以使用:

简单地注入QueueExecutor
@Reference
QueueExecutor queueExecutor;