在一些biztalk的论坛或者技术群中,经常有初学biztlak的朋友问:biztalk怎么调试,biztalk可不可以单步调试?
的确,biztalk的开发跟一般的软件开发方式不太一样,biztalk基于图形化的设计更多些,这一方面方便了设计,使设计biztalk的应用更直观简单,另一方面设计形式的改变也改变了大家已习惯了的传统调试软件方式,给初学者带了一些困惑。
在调试biztalk的应用时,特别是orchestration时,不再是一长串的代码,然后在其中某行代码上设置一个断点,最后调试运行,运行到断点处程序中断,查看各个变量已判断问题所在。
Biztalk中以图形方式取代了长串的代码,也不再有源代码级的单步调试,取而代之的是综合的调试手段。下面详细讨论biztlak中的常用调试手段。
一、 在Biztalk administration console中查看挂起的服务
调试biztalk的应用时,如果没有得到预期的结果,比如给了输入的消息,在应该输出消息的位置没有得到预期的消息,肯定是哪个环节出错了,这时首先应该检查的是否有挂起的服务实例,因为biztalk以消息为核心,而消息都是在某个服务实例中被处理的,一旦出错,出错的服务实例连同正在处理的消息就会被biztalk挂起:
l 打开Biztalk Server 2006 Administration
l 在Administration Console左边的树形结构中选Biztalk Group
l Administration Console右边窗口显示Group Overview,按F5刷新状态,在Suspended Items下可以看到目前是否有被挂起的服务,如下图:
Figure 1 Biztalk Administration Console中查看挂起的服务
如果Suspended service instances的计数不为0,就表示有被挂起的服务实例,点击Suspended service instances查看被挂起的具体服务实例。
打开挂起服务实例后,在窗口的右下方显示具体的被挂起的服务实例,双击某个服务实例,即可查看这个挂起服务实例的被挂起的原因:
Figure 2 Biztalk Administration Console中查看挂起服务的挂起原因
在Service Details窗口中,点击Messages标签,查看此服务实例正在处理的那个消息:
Figure 3 Biztalk Administration Console中查看挂起服务的相应消息
二、 查看事件日志
一般biztalk中发生的错误都会在事件日志中有反映,在上面的查看挂起的服务实例中能查到的错误,一般在日志中也都会有反映。但是有时由某些错误导致biztalk应用出错,在biztalk中只反映了跟biztalk直接相关的错误,最原始导致错误的原因可能在事件日志中才会有更详细的反映。
所以,如果在biztalk Administration Console中如果没有找到正真的错误原因时,到事件日志中找找可能会有所发现。
l 开始 – 管理工具 – 时间查看器
l 在事件查看器中右边目录,选“应用程序”,来源为“Biztalk Server
Figure 4 事件日志中查看biztalk应用相关出错信息
三、 使用Orchestration Debugger断点调试Orchestration
Biztalk中orchestration是实现应用功能的主要手段,业务的流程就是它来实现的,对orchestration是调试一个biztalk应用的最主要的部分。
Orchestration是图形化的设计工具,biztalk也设计了个图形化的调试工具,叫做Orchestration Debugger。这个调试器可以对Orchestration进行断点调试,在断点出同样可以查看各个变量、消息、以及端口的状态。
1、 打开Orchestration Debugger
要想在Orchestration Debugger中打开某个orchestration,这个orchestration必须已经被执行过,或者正在执行中。
注意:
如果第一次开始测试一个orchestration,当消息进入到biztalk,在入站的接收管道内就出错了,接收端口这个服务实例就会被挂起,消息也不会被路由到要处理这个消息的orchestration,这时这个orchestration还未被执行,所以这种情况是无法在Orchestration Debugger中打开这个orchestration,必须在排除了接收管道的错误,消息能够进入到Orchestration后才可能进行Orchestration的调试。
有两种方法打开Orchestration Debugger。
1.1. 在HAT中打开Orchestration Debugger
l 开始 – 所有程序 – Microsoft Biztalk Server 2006 -- Health and Activity Tracking
l 在打开的HAT窗口中,选Queries – Most Recent 100 Service Instances
l 在列出的最新的100个服务实例中,找到你要调试的那Orchestration,点击鼠标右键,选Orchestration Debugger。
1.2. 在Biztalk Administration Console中打开Orchestration Debugger
在Biztalk Administration Console中可以查看到被挂起的服务实例和正在运行中停留在断点的服务实例,如果是Orchestration的服务实例,都可以在此打开Orchestration Debugger
1.2.1 挂起的Orchestration服务实例
l 打开Biztalk Server 2006 Administration
l 在Administration Console左边的树形结构中选Biztalk Group
l Administration Console右边窗口显示Group Overview,按F5刷新状态,在Suspended Items下可以看到被挂起的服务
l 点击Suspended service instances查看被挂起的具体服务实例。
l 打开挂起服务实例后,在窗口的右下方显示具体的被挂起的服务实例,如果有你需要调试的Orchestration被挂起,在这个Orchestration上点击右键,选Orchestration Debugger
1.2.2 在断点的Orchestration服务实例
如果一个Orchestration 已经被设置了断点(如何设置断点后面讨论),Orchestration运行到断点处中断,Orchestration服务实例处于运行中状态。查看这样的服务实例同上面步骤一样,只是在第三步是查看Running Service Instances。
2、 设置断点
在Orchestration Debugger中打开了一个Orchestration后,就可以对这个Orchestration设置断点了。
在Orchestration Debugger中,一个Orchestration只显示流程的中间部分,Port Surface部分的端口不被显示,可以在流程的各个形状上设置断点:
Figure 5 Orchestration Debugger中设置断点
设置断点的方法是:选择要需要设置断点的形状,按F9。如果要取消断点,再次按F9键。
2.1. 类级别断点
上面方法设置的断点是类级别的断点,一旦设置了,对以后的这个Orchestration的服务实例都起作用,直到取消这个断点。
2.2. 实例级别断点
当在Orchestration Debugger中附加(Attach)当前在断点的Orchestration服务实例(如何附加下面讨论),即真正在Orchestration Debugger中打开了在断点的那个服务实例后,这时设置的断点只针对当前正在调试的Orchestration服务实例,对其他服务实例不起作用。
3、 断点调试
必须在Orchestration Debugger中打开需要被调试的那个Orchestration服务实例才能对这个Orchestration服务实例进行调试。
只有运行中的Orchestration服务实例才能被断点调试。
运行中的Orchestration服务实例一般有两种情况:出错被挂起、在设置的断点处中断。
出错被挂起的Orchestration服务实例在Biztalk Administration Console挂起的服务中找。在断点处中断的服务在Biztalk Administration Console的Running Service Instances中找。
l 在找到的需要调试的Orchestration上点击右键,选Orchestration Debugger
l 在打开的Orchestration Debugger窗口中,选Debug – Attach,这样就把当前需要调试的服务实例附加进来。这时的Orchestration Debugger看上去是这样:
Figure 6 Orchestration Debugger中附加服务实例后断点
这时,可以看到,服务实例被附加进来,并在设置的断点处中断,窗口下部多了两个窗格。
Variable List 窗格显示了当前消息、变量和端口。
Variable List 窗格显示的变量的类型格式为: Assembly.Namespace.Name
Variable Properties 窗格显示Variable List 窗格选择的变量的值。
Orchestration Debugger不能单步调试,但是可以通过不断的设置断点来实现类似单步调试的效果。
附加服务实例后设置的断点为实例级别的断点,只对当前服务实例有效。
四、 在流程中使用System.Diagnostics.EventLog.WriteEntry方法写入系统日志
设计中在orchestration的一些关键点设置了表达式形状,在orchestration运行到这些点的时候,表达式往日志中写入表示已执行到这一点的信息。使用类似下面这样的语句:
System.Diagnostics.EventLog.WriteEntry("用户信息插入到Sql之前","Ack_Sample");
Figure 7 在表达式中往事件日志写信息