【发布时间】: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