博客园  :: 首页  :: 联系 :: 订阅 订阅  :: 管理

坚持学习WF(22):跟踪规则

Posted on 2008-10-08 07:30  生鱼片  阅读(2921)  评论(6编辑  收藏  举报

 坚持学习WF文章索引

由于规则不是程序化的代码,你不能使用vs的调试器来调试,如果我们要调试有规则的工作流程序,我们可以开启规则引擎的Tracing功能。我们下面以一个例子来说明。我们需要建立一个顺序型工作流项目,在工作流设计器中放入一个PolicyActivity活动,然后设置其RuleSetReference属性,我们建立以下规则集。如下表所示:

Rule Conditon ThenAction ElseAction
RuleC this.D < 100

this.B = this.B - 12
System.Console.WriteLine("RuleC:Then" + this.B)

 
RuleB this.B > 50

this.C = "Preferred"
System.Console.WriteLine("RuleB:Then" + this.C)

this.C = "Normal"
System.Console.WriteLine("RuleB:Else" + this.C)

RuleA this.A > 10

this.B = 60
System.Console.WriteLine("RuleA:Then" + this.B)

this.B = 40
System.Console.WriteLine("RuleA:Else" + this.B)

 

规则编辑器如下图:

tracerule1

然后我们在项目中添加App.config文件,在配置文件开始规则的跟踪功能,代码如下:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <system.diagnostics>   
    <switches>
      <add name="System.Workflow.Activities.Rules" value="ALL" />
      <add name="System.Workflow LogToFile" value="1" />
    </switches>
  </system.diagnostics>
</configuration>

 

在此示例中,第二行添加节点启用文件的日志记录。该文件使用名称 WorkflowTrace.log 在宿主应用程序目录中创建。第一行中的TraceLevel属性值ALL表示所有可以预测到log信息都会被记录,如果你想过滤到一些log,你也可以指定Information和Verbose等,该选项通过将名称参数设置为等于“System.Workflow LogToTraceListener”来启用 TraceListener 的日志记录。这样设置后,Windows Workflow Foundation 将会枚举在宿主应用程序中创建的每个 TraceListener,并向它们发送所有日志记录信息。值属性的可能值包括:

说明
All 记录接收到的所有消息
Off 不记录任何消息
Critical 仅记录关键消息
Error 记录关键消息和错误消息
Warning 记录关键、错误和警告消息
Information 记录关键、错误、警告和提示消息
Verbose 记录关键、错误、警告、提示和详细消息

 

工作流中赋响应初始值如下:

private int A = 12;
private int D = 99;
private int B = 0;
private string C = "";


下面为宿主程序代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Workflow.Runtime;
using System.Workflow.Runtime.Hosting;

namespace CaryRuleTracing
{
    class Program
    {
        static void Main(string[] args)
        {
            using(WorkflowRuntime workflowRuntime = new WorkflowRuntime())
            {
                AutoResetEvent waitHandle = new AutoResetEvent(false);
                workflowRuntime.WorkflowCompleted += delegate(object sender, 
WorkflowCompletedEventArgs e){waitHandle.Set();}; workflowRuntime.WorkflowTerminated += delegate(object sender,
WorkflowTerminatedEventArgs e) { Console.WriteLine(e.Exception.Message); waitHandle.Set(); }; WorkflowInstance instance = workflowRuntime.CreateWorkflow(typeof
(CaryRuleTracing.Workflow1)); instance.Start(); waitHandle.WaitOne(); } } } }
  
我们现在完成项目来运行程序,得到结果如下:
tracerule2 
    
我们打开WorkflowTrace.log看看里面都记录了什么,下面只是log中部分的记录,你可以打开该文件查看详细记录:

规则“RuleA”条件 依赖项:“this/A/”
规则“RuleA”THEN 副作用:“this/B/”
规则“RuleA”ELSE 副作用:“this/B/”
规则“RuleB”条件 依赖项:“this/B/”
规则“RuleB”THEN 副作用:“this/C/”
规则“RuleB”ELSE 副作用:“this/C/”
规则“RuleC”条件 依赖项:“this/D/”
规则“RuleC”THEN 副作用:“this/B/”
规则“RuleA”THEN 操作触发规则“RuleB”
规则“RuleA”ELSE 操作触发规则“RuleB”
规则“RuleC”THEN 操作触发规则“RuleB”
执行
计算规则“RuleA”的条件。
计算为 True 的规则“RuleA”条件。
计算规则“RuleA”的 THEN 操作。
计算规则“RuleB”的条件。
计算为 True 的规则“RuleB”条件。
计算规则“RuleB”的 THEN 操作。
计算规则“RuleC”的条件。
计算为 True 的规则“RuleC”条件。
计算规则“RuleC”的 THEN 操作。
规则“RuleC”副作用启用规则“RuleB”重新计算。
计算规则“RuleB”的条件。
计算为 False 的规则“RuleB”条件。
计算规则“RuleB”的 ELSE 操作。

 

1.Log的第一部分记录了各个规则的依赖项,当某个规则修改的时候会引擎哪些规则的重算。

2.从log我们可以看出规则的执行顺序并不是规则编辑器中设置的顺序,而是在优先级一样的情况下,按字母顺序来执行。我们例子中是RuleC,RuleB,RuleA,执行的顺序就不是了。

3.通过log我们也可以证实WF规则引擎的正向链接的特性,例子中RuleC引起了RuleB的重算。

这些只是WF中跟踪的一部分功能,我们后面后专门来学习WF中的跟踪的相关知识。