【问题标题】:Create A Service And Allow Only One Bundle To Hold That Service At any Time创建一个服务并在任何时候只允许一个捆绑包持有该服务
【发布时间】:2023-03-26 23:14:02
【问题描述】:

我正在尝试创建一个服务,以便一旦创建它就只允许自己在任何时候由单个消费者/捆绑包持有。 (如果这违反了 OSGi 的理念/规范,那么这显然提供了一个快速的答案,但参考了 OSGi 规范。声明这一点将不胜感激。)

为了实现这样的需求,我实现了ServiceFactory 接口,认为只要有服务需求,就会调用getService(Bundle bundle, ServiceRegistration<S> registration) 方法,我可以在这里确定Bundle 是否是新消费者与否,并采取相应的行动。

在我测试过的场景中似乎不是这种情况。

使用 Apache Karaf 并通过蓝图实例化服务的使用者,似乎永远不会调用 getService 方法。相反,消费者的服务绑定方法被直接调用,但注入了一个代理服务对象。

虽然我知道 Blueprint 使用代理,但即使它是使用服务的代理对象,ServiceFactory 合同仍有义务履行?

我为什么要这样做? 我正在尝试包装 JavaFX 和 Stage 类,并且因为 JavaFX 对 OSGi 不友好,我正在尝试协调对 Stage 对象的访问。我知道有诸如 Drombler 之类的框架,但对它们的简要了解让我认为它不适合我的用例。它们似乎对我的需求过于严格,例如我不一定希望以 Drombler 使用的方式布局应用程序。

【问题讨论】:

  • 我不会以我期望它只使用一次的方式设计服务。如果你实施这样的解决方案,你最终会陷入一个混乱的框架,只有最初实施代码的人知道要触摸什么。我也建议不要使用蓝图。 Aries Blueprint 是超级错误的,即使是基本用例也不稳定。即使技术本身是稳定的,背后的概念也是“bug”,导致系统不稳定。
  • 嗨巴拉兹。需要澄清的是,该服务不会只使用一次,而是在任何时候都只能由一个消费者持有。一旦这样的消费者放弃了对服务的命令,相同的服务将可供另一个捆绑包使用。你做了一些关于 Aries Blueprint 的有趣的 cmets,虽然我可以选择不使用 blueprint,但我的用例认为我的服务的第三方消费者可能会使用 Blueprint。

标签: osgi apache-karaf apache-felix blueprint-osgi


【解决方案1】:

这取决于您所说的消费者是什么意思。 ServiceFactory 确实让您有机会为每个在您的服务上调用getServicebundle 创建一个单独的服务实例。您的问题尚不清楚,但我怀疑您没有看到多次调用getService,因为您是从同一个消费者捆绑包中获取服务。在这种情况下,ServiceFactory 只是重复返回同一个对象。

至于您关于限制对单个消费者的访问的一般性问题,这并不真正违反 OSGi 理念。很抱歉,我没有为您提供规范参考,但线索就在名称中:这是一项可供所有人使用的服务

【讨论】:

  • 嗨,尼尔。为了澄清,getService() 在部署该服务的消费者时永远不会被调用。我创建了两个单独的包,它们都需要该服务,其中一个是“虚拟”包来测试这种情况。在这两种情况下,当它们被部署(通过蓝图)时,永远不会调用 getService 方法,而是在绑定方法中看到传入的代理对象。
  • 我接受 OSGi 对服务的定义意味着它对所有人都可用,而不考虑消费者的数量,但我确实认为有理由允许对服务的数量进行限制消费者。在这种情况下,我试图控制对 JavaFX Stage 对象的访问,而不是允许有意、恶意或意外部署的多个捆绑包随机抓取 Stage 对象。我确信还有其他与 JavaFX 无关的场景需要这样的限制:它可供所有人使用,但只有一定数量的消费者可以随时与其交互。
  • 好吧,您正在使用蓝图,所以所有的赌注都没有了。可能您必须实际调用服务上的方法,这将强制代理解析其真正的支持服务。这种不可预测性只是讨厌蓝图的另一个原因。至于您的第二条评论——我对 JavaFX 一无所知,但听起来可能 Stage 不应该直接作为服务发布,而是包装它并提供更高级别的受限 API。
【解决方案2】:

我知道有诸如 Drombler 之类的框架,但对它们的简要了解让我觉得它不适合我的用例。它们似乎对我的需求过于严格,例如我不一定希望以 Drombler 使用的方式布局应用程序。

请注意,Drombler FX 应用程序的布局是可插入的,因此您可以根据自己的需要提供自己的实现。这使您可以充分利用 Drombler FXJavaFX

虽然此功能可用一段时间,但现在有一个new tutorial trail 对其进行更详细的解释。

【讨论】:

    猜你喜欢
    • 2016-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-12
    • 1970-01-01
    • 2016-09-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多