多线程捆绑和服务实例

时间:2014-02-06 09:00:35

标签: java multithreading osgi

假设我有3个 A B B1 。捆绑 A 是我的应用程序的起点。捆绑 B 提供 A 使用的服务的API。捆绑 B1 是服务的实现。

基本上,捆绑 A 具有一组一个接一个地处理的记录。没有处理记录的命令。

我想通过同时处理记录子集来提高我的应用程序的性能。

我想到了两种不同的方式:bundle A的多个实例,以及带有多个线程的bundle A.

AFAIK,无法在OSGi容器中添加同一捆绑包的多个实例(即相同的OSGi标识)。

关于第二种可能性,由bundle A 创建的每个线程都有自己的标识。并且 B1 导出的服务需要知道使用它的线程的身份。因此,我认为ServiceFactoy适合这里。但是,我已经读过,一旦捆绑获得服务实例,它就会被缓存。因此,所有线程都将获得相同的服务实例。

我是对的吗?如果是,实施此模型的“正确方法”是什么?随意向我推荐一种更加OSGi友好的完全不同的方法。

谢谢, 迈克尔


修改

另一种可能性是修改服务接口以允许服务的消费者将其身份传递给服务。然后,该服务将变为“无国籍”,并且不需要使用ServiceFactory。然而,需要身份的事实是实现细节(即,仅对于该特定实现需要它),因此对于将来的实现,将不使用添加到接口的参数。这就是我不想触摸界面的原因。

1 个答案:

答案 0 :(得分:1)

OSGi中的“正确方法”是提供无状态的服务。

正如您已经发现的那样,ServiceFactory概念对您没有帮助,它只区分调用bundle,而不是线程,上下文或任何其他可以作为状态容器的东西。

如果您的服务必须跟踪状态,最好的方法是使其明确并提供某种参数来传递状态。 Balazs提到的RFC是未来的另一种选择(只要它符合规范)。

相关问题