OSGi请求式服务? (多个实例)

时间:2013-01-24 19:46:09

标签: java osgi osgi-bundle

因此,我想解释它的最佳方式是使用示例。

发布服务X时,需要注册一个实例。同样的实例回答了许多客户称之为。

我想知道是否有办法按需实例化它的许多实例。就像客户端c1在实例x1下请求服务X一样,客户端c2与实例x2通信,并且在处理之后每个实例都被销毁。

因为它适用于Web服务器。每个客户端方法调用都是一个请求,并在响应后该请求被销毁。

我看到了一些关于多个引用的答案,但我不太确定它们是否都是我的问题。

三江源

2 个答案:

答案 0 :(得分:1)

几年前,我试图在RFC正版服务工厂中以通用的方式回答这个问题。经过深思熟虑,我得出的结论是解决方案非常简单。只需注册工厂服务。因此,如果您希望能够创建Foo,只需注册一个FooFactory服务......这样您就可以获得所有参数,类型安全等等。如果需要通用解决方案,只需创建工厂类型:

public interface Factory<T> { T create(); }

@Component
public class FooFactoryImpl implements Factory<Foo> {
  public Foo create() { ... }
}

然而,我发现最好的方法就是创建一个FooFactory,因为这样可以让你一直保持类型安全,因为泛型类型往往需要强制转换。它还为您提供了可扩展性,参数以及语义的所有适当文档。

我所知道的所有其他解决方案都倾向于遭受重型铸造并绕过类型系统。声明性服务中的工厂组件是一个案例。我认为OSGi服务注册表的职责是为您提供帮助。与所有技术一样,添加额外的语义非常诱人,因为它通常很接近。我认为这是一个比Java更好的Java案例。把事情简单化。

答案 1 :(得分:0)

OSGi目前支持ServiceFactory,它允许提供程序为每个使用者捆绑包创建唯一的服务实例。这可能足以满足您的需求

但它不允许提供程序为bundle中的服务的每个请求提供唯一的服务实例。我正在制定一个R6提案,允许为每个请求创建唯一的服务实例。希望它能被R6规范所接受。