2015-11-26 49 views
0

在开发过程中,我们倾向于分解我们的声明性服务组件,所以OSGi自然不会激活其他相关组件。有没有办法来诊断潜在的问题,即。 “为什么组件没有被激活?”OSGi诊断组件的缺失依赖

对于一个简单的依赖图:

A------>B------>C------->E 
       ^
       | 
     D-------+ 

E未能被激活所有相关组件,CDBA没有得到激活。我需要一个控制台命令来问“为什么A未被激活?”答案将包含答案:“A取决于B,B取决于C,C取决于E,E不可用”。

+0

可能没有。如果E不活跃,则其受抚养人不能被激活。当我试图手动激活一个组件(比如说B)时,这会变得更加清晰,但是日志说因为E没有解析,所以你不能激活B.所以,你需要首先激活E。 – Abie

回答

1

目前尚不存在,尽管它可以使用ScrService API开发。这当然会成为一个有趣而有用的项目。

你的两个诊断选项的瞬间是:

  1. 在GOGO壳scr:listscr:info命令。这些会告诉你为什么一个单独的组件不活跃。例如,如果你问A为什么不活跃,它会告诉你它有一个未被满足的B服务参考。然后,您将不得不跟踪哪个组件应该注册B服务,并找出为什么它不是活动的。等等。

  2. X-Ray plugin for Felix WebConsole将为您提供服务和组件的图形表示。它不会直接为您提供根据要求提供的根源,但它可以帮助有经验的用户更快速地找到比scr命令更快的问题。

+0

如果你需要一个工作的例子,在Apache Felix Dependency Manager中,我们已经实现了一个shell命令来完成这个工作。它使用内部API来完成繁重的工作。我并不是建议你应该抛弃DS,而是应该像Neil所暗示的那样,使用该代码作为例子(自己实现这样的逻辑)。作为参考,它是“dm wtf”命令(我们都知道的缩写代表“失败在哪里”;))。 –

+0

谢谢马塞尔。构建这种诊断的主要问题是组件不依赖于组件。一个组件取决于一个* service *,它可能会或可能不会被另一个组件提供。所以你构建的任何解决方案都必须使用一定数量的猜测和启发式。它仍然是有用的,只是不完美。 –

+0

谢谢。顺便说一句,如果你正在使用equinox(和我一样),相应的命令是“list”和“comp”。命令在这个文件中实现:[SCRCommandProvider.java](http://bit.ly/1MTuGJ6) – b10y