OSGi enRoute – 2.2_7 – Debugging调试

本节中你将学到什么

在之前的章节中我们已经学习了如何在一个框架中运行我们的bundle。在这一部分我们将会更深入地学习如何调试代码。我们将会教你如何逐步调试bundle以及如何使用可用的扩展工具。

调试

当你的OSGi框架正在快乐地运行而你正在改代码的时候,你是有办法了解内部运行机制的。你只需要设置一个普通的IDE断点(在左边的空白栏上双击)并且让代码运行到该处即可。

例如:在EvalImpl.eval 方法上设置一个断点。当你输入Gogo的test:eval 命令的时候,你将会看到IDE进入了你的断点。在你进入调试器之前,Eclipse可能会提示你如下图的对话框:

20171203_101

这个对话框可以被跳过,一般情况下当你遇到断点的时候,你肯定会希望进入调试器。现在你会获得如下图的内容:

20171203_102

与平时在Java调试器中类似,你可以修改并保存代码。在这种情况下,你经常会得到一个警告,告诉你不能改变代码否则会需要重启。

20171203_103

切,这种情况只会在老掉牙的经典环境中才会出现!在OSGi环境中我们不需要依赖Eclipse或JRevel所尝试使用的给类打补丁和破解的复杂技术。一次改变意味着一个新的Bundle会被部署到运行着的服务器中。因此即使IDE足够聪明,知道如何给类打补丁,它也会很快被新的bundle所覆盖。因此只需要点击勾选框以便在将来都忽略这个警告。

里面都有什么?

OSGi enRoute绝不会让你掉队,你的生活将会波澜不惊,而且你会有足够的时间来享受阳光沙滩。嗯,当然,我们会努力尝试不过计算机暂时还没有那么智能,因此你还是需要做一些调试和诊断的工作来使得应用程序正常工作。听起来很让人沮丧,但这是事实。

Apache Felix Web Console是最好用的OSGi应用程序调试工具之一。关于OSGi所有你想知道的一切,它都提供了洞察机制,甚至更多。特别是Web控制台插件XRay对于初学者来说非常有用,因为它对服务层进行非常好的可视化。在XRay中,通过图标来表示每种服务类型,并且根据Bundle的注册和获取(甚至仅仅是监听)来动态表示。

首先我们切换到bndtools视图(一般bndtools图标位于右上角)。然后双击bnd.bnd文件,选择Run选项卡并且将osgi.enroute.webconsole.xray.provider添加到Run Requirements清单中。由于我们使用了依赖,这个插件将会自动添加web控制台和Jetty web server。

20171203_104

然后点击Reslove按钮。这将会添加一个web服务器,Apache Felix Web Conslole,以及XRay。保存文件,然后访问http://localhost:8080/system/console/xray。默认的用户名密码都是admin(谢谢Felix的朋友们,我并没忘记它们!)。Apache Felix Web Console是一个非常让人惊奇的工具,因此让我们来学习使用它!

另外,如果provider bundle 是灰色的,点击XRay顶端的Start All按钮。

如果你偶然犯了点错误,则可以杀掉对应的运行进程(Console view)上的红色按钮。然后双击bnd.bnd文件,选择Run选项卡并点击Debug As按钮。

XRay

XRay可能并不适合大型系统但对于很多初学者来说是良师益友,因为它将OSGi框架的动态性进行了可视化。

20171203_105

在XRay中的界面比上图中的大得多,你可以将窗口滚动到左边。

服务(Services)

服务是至关重要的元素,它们会在描述服务的图表中出现许多次。每个三角形表示一个服务。三角形可以用多种不同的方式连接,表示不同的含义:

● 顶点-连接到三角形的顶点表示注册。这使得三角形的顶点指向接受服务用户方法调用的对象。

● 垂直边-连接到垂直边表示服务的客户端。客户端调用服务的方法。

● 斜边-连接到斜边表示服务监听器。

20171203_106

你可以看见像箭头一样的三角形,箭头的方向是依赖/调用/使用的方向。使用不同的颜色来表示服务:

● 黄色——表示服务已经被注册并且在使用中。

● 白色,实线边框——如果一个服务是白色并且是实线边框,则表示该服务已经被注册了,但是在系统中没有谁跟它有关系。

● 白色,虚线边框——如果一个服务是白色并且是虚线边框,则表示有Bundle在寻找该服务,但是没有谁注册了该服务实例。

● 红色——该服务发生了严重的问题。这通常是由于不正常地刷新了系统导致。

● 橙色——橙色表示对应的服务被导入或导出了。

如果你将鼠标悬停在一个服务上,则与其它服务相关的连接线都会被移除,仅与当前指向的服务相关的Bundle会被保留。也就是说,服务三角形表示type,而不是实例。即使某给定的服务有1000个实例,你也仅仅会看到一个三角形。

几乎所有的元素在鼠标悬停其上并且被点击时都提供了一个提示信息。如果你点击一个服务,我们会导航到Service选项卡。因为每种类型的服务都可能会有多个服务对象,所以你将需要自己查找相对应的服务。

20171203_107

如果你点击服务左边的三角形,它将会给你相关的细节信息。注意,之所以我们能够看到这些信息是因为我们在《Provider工程》一章中已经为此服务注册了Gogo shell所需的属性。

组件(Components)

如果我们返回到XRay,我们将会看见一个Bundle带有一个绿色的LED(但愿如此);每个LED都表示一个Component。如果它是绿色的则表示一切正常,如果是红色的则表示要么缺失依赖,要么缺少配置。如果你点击对应的LED,例如 com.acme.prime.eval.provider Bundle,则你会进入该Component相关的Component选项卡。该选项卡将会是你的最佳拍档!它会告诉你与该Component相关的所有信息。

20171203_108

最重要的信息是它的引用是否已经全部就绪,以及是由谁来保证的。一般来说,如果一个Component是active或registered状态就说明是正常的。

有一个小窍门,有一个让人迷惑的用例。有时候一个Component没有处于就绪状态,但它的所有引用都已经存在了。在这种情况下你可能是缺失了配置信息。Component可以声明自己需要被正确配置。

配置

Configuration选项卡提供了对配置信息的管理。这是最有意思的选项卡之一,因为它为访问配置数据提供了良好的接口。通过Meta Type Service,我们可以提供有效的信息来创建一个编辑器。

20171203_109

如果你点击其中的一个条目则会打开这样的一个编辑器:

20171203_110

Bundles

如果你再次回到XRay界面,则你会看到在左侧的圆角矩形所表示的Bundle。这些Bundle也使用了不同颜色来表示:

● 橙色 – 激活状态(Active)

● 灰色 – 已解析(Resolved)

● 白色 – 已安装(Installed)

以停止Apache Felix Metatype Bundle为例。首先将鼠标悬停在该Bundle上来查看已注册的服务,你会看到它注册了一个MetaTypeService。如果你找不到它,则在右上角的文本框中输入metatype并回车。这会将所有名称中带有metatype的Bundle都以红色标出来。

要停止Apache Felix Metatype bundle,在它的方框上单击,然后再Bundle明细选项卡中点击stop按钮(标准的播放器停止按钮,一个黑色的方框)。

20171203_111

如果你现在回到XRay,你将会看到metatype Bundle已经变成了灰色并且它不再带有任何已经注册的服务。

20171203_112

如果一个插件展示了警告标志,则意味着该bundle的log中出现了错误。XRay会跟踪日志,如果发现有bundle在过去的两分钟里产生了错误日志或者警告日志,则它会将对应的Bundle上标上警告标志。如果你将鼠标悬停到该Bundle上则会看到对应的日志信息。

你可以通过点击右上角的Start All按钮来再次启动所有的Bundle。

它是如何工作的?

首先我们创建了一个带有XRay Web Console插件的运行时环境。由于此插件需要Web Console,而Web Console需要Http Server,这些都启动后我们就得到了一个完整的环境。当系统被启动后,XRay插件Bundle注册了一个特殊的服务,它会被Web Console侦测到。这个服务被称为白板(White Board)。然后XRay调用插件来生成其HTML。

XRay插件会返回一个带有JavaScript的页面,它会每隔几秒轮询一次Server。Server会返回数据,这些数据随后会被JavaScript库(d3.js)进行渲染展现。

 

打赏一下
支付宝
微信
除非注明,博客文章均为原创,转载请标明文章地址
本文地址: http://www.javafxchina.net/blog/2017/12/osgi-enroute-0202-07/
百度已收录