我使用 osgi控制台。命令ss
非常有用,但我想观察每个bundle的状态变化以进行调试。可能吗?
答案 0 :(得分:1)
是的,这是可能的。
使用LogService
请参阅OSGi Compendium规范中 101日志服务规范章节下的 101.6.1 Bundle Event Mapping 一章:
简而言之:如果容器中有LogService实现,则会记录每个Bundle和Service事件。可以使用LogReaderService读取记录的记录。 Equinox有一个内置的实现,在Felix中我通常使用implemented by Felix。
在容器中有一个LogService实现后,你应该以某种方式实现将结果写入控制台。这里有几种方法。我可以推荐的是:
实施BundleListener
您可以使用BundleListener
捕获所有实时捆绑事件实施BundleTracker
您可以实现BundleTracker,以便捕获所有Bundle事件。在这种情况下,您将获得在打开跟踪器之前发生的已安装捆绑包的最后事件(至少已安装)。
答案 1 :(得分:0)
另一种方法是使用Byteman。它会是这样的:
####################################################
RULE Bundle state change
CLASS org.eclipse.osgi.framework.internal.core.AbstractBundle
METHOD beginStateChange()
IF TRUE
DO
System.out.println("[STATE CHANGE] " + $this.getBundle() + " > " + $this.getBundle().getState());
ENDRULE
####################################################
RULE Bundle complete state change
CLASS org.eclipse.osgi.framework.internal.core.AbstractBundle
METHOD completeStateChange()
AT EXIT
IF TRUE
DO
System.out.println("[COMPLETE STATE CHANGE] " + $this.getBundle() + " > " + $this.getBundle().getState());
ENDRULE