OSGi declarative service is active, but bind() is not called
我在 OSGi 上下文中遇到了一个我不理解的声明性服务问题。我试着解释一下:
我有一个需要
目标是,如果
它在 Windows 上运行良好,但在 Linux 上我遇到了问题,即
识别
我不明白,为什么会这样。可以通过增加
我附上一张描述服务之间引用的图片。任何提示表示赞赏。提前致谢!
最好的问候
斯蒂菲
服务管理器图
这里有一个循环,按理论应该没问题。但是,在实践中存在许多问题。
首先,你的实现应该是
中有描述
但是,还有一个问题 :-( Apache Felix DS 有一个错误,会导致您描述的影响。这个错误与捆绑排序有关。这在 Apache Felix JIRA 5618 中报告。
如果这个 DS 错误是问题所在,那么不幸的是只有一个可靠的解决方案。不幸的是,因为它需要你深入到 OSGi 的内部。解决办法是手动注册manager服务,并确保它没有被DS注册:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | @Component(service={}, immediate=true ) public class FooManagerImpl implements FooManager { private ServiceRegistration<FooManager> registration; @Reference volatile List<FooService> foos; @Activate void activate( BundleContext context, Map<String,Object> properties ) { registration = context.registerService(FooManager.class, this, new Hashtable<String,Object>(properties)); } @Deactivate void deactivate() { registration.unregister(); } ... } |
这里的诀窍是 FooManager 在它被激活之前不会注册它的服务,而通常它是在它被激活之前注册的。
我知道 Apache Felix 正在研究它,但不知道他们有多远。
无论如何,循环总是很糟糕。可悲的是,它们并不总是可以预防的,但我肯定会尝试。
Note: registering a service manually will not create a capability. If you use Requirements/Capabilities you should add a service capability in the manifest to make the resolver work. If this line is gibberish to you, ignore it.