【问题标题】:OSGi Request-Like Services? (multiple instances)OSGi 类请求服务? (多个实例)
【发布时间】:2013-01-24 19:46:09
【问题描述】:

所以我想到的最好的解释方式是用例子。

发布服务X时,需要注册一个实例。同一个实例可以回答尽可能多的客户所称的。

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

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

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

谢谢

【问题讨论】:

    标签: java osgi osgi-bundle


    【解决方案1】:

    几年前,我尝试在 RFC Genuine Service Factories 中以通用的方式回答这个问题。经过一番艰苦的思考,我得出结论,解决方案非常简单。只需注册工厂服务即可。因此,如果您希望能够创建 Foo,只需注册一个 FooFactory 服务......这允许您拥有参数、类型安全等所有优点。如果想要一个通用解决方案,只需创建一个工厂类型:

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

    但是,我发现最好的方法是创建一个 FooFactory,因为这可以为您提供类型安全,因为泛型类型往往需要强制转换。它还为您提供了可扩展性、参数以及最重要的语义的正确文档。

    我所知道的所有其他解决方案往往会受到重铸和绕过类型系统的影响。声明式服务中的工厂组件就是一个例子。我认为 OSGi 服务注册中心的职责是给你一个句柄。与所有技术一样,添加额外的语义非常诱人,因为它通常很接近。我认为这种情况留给 Java 比留给 OSGi 好得多。把事情简单化。

    【讨论】:

      【解决方案2】:

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

      但它不允许提供者为捆绑中的服务的每个请求提供唯一的服务实例。我正在为 R6 制定一项提案,以允许为每个请求创建唯一的服务实例。希望它会被 R6 规范接受。

      【讨论】:

      • 非常感谢您的帮助。请您指出我在哪里可以找到一些说明每个请求的实例尚不可能的文档?
      • 好吧,我的疑问来自以下情况:我有一个简单的 2 捆绑应用程序项目。第一个通过 SOAP over HTTP 发布服务,仅作为另一个包的接口,这是我的应用程序的核心,有时可以根据需要花费尽可能多的秒数。问题是(从我得到的)我无法将我的请求从 WS 包正确分派到我的核心包,因为 WS 提供的每个请求的线程与单实例包服务相比。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-26
      • 1970-01-01
      • 2011-08-17
      • 2018-07-23
      • 2019-12-25
      • 2014-04-23
      相关资源
      最近更新 更多