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

时间:2010-02-05 21:06:21

标签: java service osgi

我正在尝试了解为服务事件提供的保证。

OSGi规范说ServiceEvents是同步的,我这意味着ServiceListener不会收到带有UNREGISTERING ServiceEvent的serviceChanged()调用,直到使用REGISTEREDServiceEvent的serviceChanged()调用完成为止。这是对的吗?

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

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

1 个答案:

答案 0 :(得分:1)

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

要专门回答你的问题,它不是对事件的多线程关注,而是一个可重入的问题。这就是处理您的注册事件的人可以在完整树处理之前通过另一个事件通知回复给您。这是他们强烈建议您在持有锁时不注册或取消注册服务的原因之一,否则您可能会使事件调度程序线程死锁。保持安全的另一个好方法是拥有一个bundle依赖树,而不是一个图。捆绑包之间的循环依赖关系,即使编译类可能会导致实际问题。

我希望这会有所帮助。如果你想了解更多这方面的内容,OSGi和Equinox上会出现一本新书。它现在可用于粗切割,应该很快就可以打印出来。   http://my.safaribooksonline.com/9780321561510