【问题标题】:OSGI: DS and component factories issuesOSGI:DS 和组件工厂问题
【发布时间】:2015-07-11 08:13:50
【问题描述】:

我需要的是每次当一些消费者需要这个服务+使用 CDI 时获取新的服务实例。我已经阅读了很多文章,但我找不到我的 2 个问题的答案。

  1. 如果我们使用工厂,为什么在服务消费者中我们调用工厂(http://www.rpgnextgen.com/wiki/doku.php?id=component_factory)然后我们得到服务的引用。我是说

    // get factory
    ComponentFactory factory = (ComponentFactory) context.getService(serviceReferences[0]);
    // get instance
    ComponentInstance instance = factory.newInstance(null);
    

osgi inside 调用工厂时,有没有办法在服务消费者调用服务时设置具有特定接口的工厂?

  1. 如果在服务消费者中我们调用工厂,那么为什么在事实上的工厂是组件时我们将服务标记为组件?

问题是没有工厂我做@Inject @OsgiService (javase) 或@OSGiService (javaee) 并且我可以使用不同的过滤器并且代码非常清晰。使用组件工厂我(据我所知)失去了这种能力。

【问题讨论】:

  • 恐怕我不明白你的问题。
  • @BJ Hargrave 感谢您抽出宝贵时间。我会尽力解释。我们有三个实体:服务消费者、组件工厂和组件。据我了解,如果我想在服务消费者中获取组件,那么在服务消费者中我必须调用 factory.newInstance()。我无法理解其中的逻辑。例如,在 javafx 中,您只需使用某个接口设置 somefactory,然后忘记该工厂,因为它是“自动”使用的。我不明白为什么在 osgi 中我应该调用工厂,而不是通过 osgi 获取对组件的引用(它 osgi 必须调用工厂)。我能解释一下我的第一个问题吗?
  • 不需要使用ComponentFactory。
  • @BJ Hargrave 你能告诉我应该读什么吗?

标签: java osgi apache-felix


【解决方案1】:

ComponentFactory 存在于想要使用工厂的消费者,因为他们想要控制单个组件的生命周期。例如,如果他们想为每个 Web 请求创建一个组件实例。

如果您不想使用ComponentFactory...,那就不要使用。

【讨论】:

  • 感谢您的宝贵时间。我需要每个消费者新的组件实例。这就是为什么(据我所知)我必须使用组件工厂。但是,我不明白为什么我不能在osgi中注册我的工厂并在不调用工厂的情况下在消费者中获得服务。问题是,如果没有工厂,我会使用 @Inject @OsgiService (javase) 或 @OSGiService (javaee) 并调用组件工厂,我会失去这种能力。
  • 不,ComponentFactory 用于不同的用例。如果您想将原型范围用于服务,则必须等到 DS 支持此功能,即 1.3 版发布。
  • 不幸的是我不能等这么久。那么,我可以通过 CDI -@Inject @OsgiService 使用 osgi 服务(每个消费者的新实例)吗?
  • 我无法回答这个问题,因为我不使用 CDI(我不是受虐狂……)。
  • 请注意,尼尔是您在这方面最接近权威的人物(osgiapache-felix)。
【解决方案2】:

我需要每个消费者新的组件实例。

我还没有尝试过,但是根据使用 PAX-CDIOSGi v6 容器时的文档,那么原型范围应该可以满足您的需求:

@OsgiServiceProvider
@PrototypeScoped
public class MyService implements SomeService{

【讨论】:

  • 感谢您的宝贵时间!问题是我必须通过 DS 创建 osgi 服务,因为在 javase(pax+weld)和 glassfish(斗鱼)中都必须使用同一个包。我知道您提供的解决方案,但它仅适用于 javase。
【解决方案3】:

OSGi 服务是 CDI 中特殊类型的 bean。将它们与 EJB 相比,您可以使用 CDI 来注入对不同类型 EJB 的引用,但组件将有自己的生命周期。 OSGi 服务也是如此。它们的生命周期不受 CDI 控制。 CDI 只是注入对这些服务的引用。

这意味着 CDI 工厂不能与 OSGi 服务一起使用。就像您不能将 CDI 工厂与 EJB 一起使用。实际上没有办法为每个注入点创建一个 OSGi 服务实例,因此也没有解决方法。

如果你需要这种模型:你必须自己创建一个工厂机制。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多