ServiceListener和ServiceTracker调用提供了哪些排序保证?

5 java service osgi

我正在努力了解为服务事件提供的保证.

OSGi规范说ServiceEvents是同步的,我认为这意味着ServiceListener不会收到带有UNREGISTERING ServiceEvent的serviceChanged()调用,直到与REGISTEREDServiceEvent的serviceChanged()调用完成为止.它是否正确?

我还看了一下ServiceTracker的来源.它似乎试图应对这两个serviceChanged()调用重叠的情况.这可能吗?

在调用ServiceTrackerCustomizer时是否有类似的保证?

小智 1

这是一个非常棘手的问题。当服务在 OSGi 中注册时,事件将被处理并通知所有感兴趣的各方(服务侦听器、服务跟踪器和声明性服务运行时)。每个感兴趣的各方都有机会处理该事件。处理事件可以包括注册或取消注册附加服务。由于ServiceEvent通知的同步行为,这些事件随后被分派给感兴趣的各方。在长依赖链中,您最终会得到一棵通知树,您可以在其中注册单个服务,并导致一大堆新人注册。我知道这一点是因为它会使性能调整 OSGi 启动成为一项非常具有挑战性的工作,因为您简单的注册服务调用会因未知数量的服务激活而付费。

具体回答您的问题,这不是对事件的多线程关注,而是一个可重入的关注。那就是处理您的注册事件的人可以在处理完整的树之前向您发送另一个事件通知。这是他们强烈建议您永远不要在持有锁时注册或取消注册服务的原因之一,否则可能会导致事件调度程序线程死锁。保持安全的另一个好方法是使用捆绑依赖树,而不是图表。包之间的循环依赖关系,即使类编译也会导致真正的问题。

我希望这有帮助。如果您想了解更多此类内容,可以阅读一本关于 OSGi 和 Equinox 的新书。该书现已提供粗剪版,并且很快就会印刷版。 http://my.safaribooksonline.com/9780321561510