【发布时间】:2015-01-15 06:39:21
【问题描述】:
我使用 osgi 控制台。命令ss 非常有用,但我想观察每个捆绑包的状态变化以进行调试。是否可以?
【问题讨论】:
我使用 osgi 控制台。命令ss 非常有用,但我想观察每个捆绑包的状态变化以进行调试。是否可以?
【问题讨论】:
是的,这是可能的。
使用日志服务
参见 OSGi Compendium 规范中101 日志服务规范 章下的101.6.1 Bundle Event Mapping 章:
简而言之:如果容器中有LogService 实现,则会记录每个Bundle 和Service 事件。可以使用LogReaderService 读取记录的记录。 Equinox 有一个内置的实现,在 Felix 中我通常使用implemented by Felix。
在容器中实现 LogService 后,您应该以某种方式将结果写入控制台。这里也有几种方法。我可以推荐以下一种:
实现一个BundleListener
您可以使用BundleListener 捕获所有实时捆绑事件
实现 BundleTracker
您可以实现BundleTracker,您可以在其中捕获所有捆绑事件。在这种情况下,您还将获得在打开跟踪器之前发生的已安装捆绑包(至少已安装)的最后事件。
【讨论】:
另一种方法是使用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
【讨论】: