【发布时间】:2021-09-13 20:48:45
【问题描述】:
我正面临一个 OSGi 问题,而且我对 OSGi 细节的了解还不够,无法找出前进的方向。
我的问题是这样的:
- 我有一个服务,它位于定义良好的接口之后,并定期在特定位置发出文件。这由配置管理员控制(通过 Karaf 中的配置文件)
- 某些组件通过 Karaf 功能文件向其他组件提供此服务,将我的服务捆绑在特定版本 (1.X.0) 中
- 其他组件在较新的版本(1.Y.0,其中 Y > X)中提供此服务,或者通过另一个功能文件,或者只是将其添加到他们的 kar 文件中。
由于这些只是较小的版本更改,因此消费服务并不真正关心它们与哪个服务通信(API 相同)。
我的问题是这两个包都在 karaf 中处于活动状态,并且存在关于谁可以覆盖谁的输出文件的竞争条件。
我尝试将@Component 变成一个单例(使用scope = ServiceScope.SINGLETON),虽然这可能会解决每个服务使用者使用相同实现的情况,但文件覆盖问题仍然存在,因为两个服务都处于活动状态。
基本上,我正在寻找一种方法来告诉 OSGi“不要打扰旧版本,新版本(与其他版本相同)适用于所有消费者(使用默认为[1.X,2[)
由于配置文件类似于启用我的服务的“API”,因此我希望避免为不同版本设置多个配置文件。
如果可能,我希望将版本位置逻辑保留在我的服务之外。我想从理论上讲,该服务可以侦听提供相同服务接口的其他版本的捆绑包,并采取适当的措施——但这对我来说似乎很麻烦。肯定有更好的方法,对业务逻辑代码(即我的服务)影响更小?
【问题讨论】: