【问题标题】:Child Activities in Windows Workflow Not Emitting Tracking DataWindows 工作流中的子活动不发出跟踪数据
【发布时间】:2014-07-15 12:58:57
【问题描述】:

我创建了一个执行一项特定任务的 Windows Workflow 4 工作流。需求发生了变化,就像在软件开发中一样,现在工作流需要多次执行任务。

我的解决方案是创建另一个工作流,每次在集合中执行第一个工作流。这工作正常。但是,我们的跟踪参与者不会为现在的子工作流发出任何记录。

参与者仍然为主工作流发出数据,但它并不理想,因为它只包含有关循环集合的信息。在执行内部工作流时,我们可以看到详细的输出。

在设置跟踪时我们是否遗漏了什么?最好我不想以不同的方式构建工作流,因为我可以想象,当我们正在开发工作流时,我们会再次遇到这种情况并且需要类似的解决方案。

  StatusTrackingParticipant stp = new StatusTrackingParticipant
  {
    TrackingProfile = new TrackingProfile
    {
      Queries = 
      {
        //Querying all states. 
        new ActivityStateQuery
        {
            ActivityName = "*",
            States = { "*" }
        },

        //querying all activty schedules ? not sure on the terminology here.
        new ActivityScheduledQuery
        {
          ActivityName = "*",
          ChildActivityName = "*"
        },

        new BookmarkResumptionQuery
        {
          Name = "*"
        },

        new CancelRequestedQuery
        {
          ActivityName = "*",
          ChildActivityName = "*"              
        },

        new CustomTrackingQuery
        {
          ActivityName = "*",
          Name = "*"
        },

        new FaultPropagationQuery
        {
          FaultHandlerActivityName = "*",
          FaultSourceActivityName = "*"
        },

        //Querying all workflow instances ? not sure on the terminology here.
        new WorkflowInstanceQuery
        {
          States = { "*" }
        },
      }
    }
  };

【问题讨论】:

    标签: workflow-foundation-4 workflow-foundation


    【解决方案1】:

    我都归结为您正在使用的Tracking Profile 以及它的配置方式。

    您的TrackingProfile 的查询中可能只有一个WorkflowInstanceQuery,并且一切正常,而执行一项特定任务的工作流程是您的主要工作流程。

    现在它是主工作流中的一个内部活动,您必须配置您的 Queries 以同时使用 ActivityStateQuery 查看这些内部活动。

    类似这样,如果您的跟踪配置文件是通过代码配置的:

    new MyCustomTrackingParticipant
    {
        TrackingProfile = new TrackingProfile
        {
            Queries =
            {
                new WorkflowInstanceQuery
                {
                    States = { WorkflowInstanceStates.Completed }
                },
    
                // Also add this query to profile's queries
                new ActivityStateQuery
                {
                    States = { ActivityStates.Executing, ActivityStates.Closed }
                }
            }
        }
     }
    

    或者通过配置:

    <trackingProfile name="Sample Tracking Profile">
        <workflow activityDefinitionId="*">
            <workflowInstanceQueries>
                <workflowInstanceQuery>
                    <states>
                        <state name="Completed"/>
                    </states>
                </workflowInstanceQuery>
                <activityStateQuery>
                    <states>
                        <state name="Executing"/>
                        <state name="Closed"/>
                    </states>
                </activityStateQuery>
            </workflowInstanceQueries>
        </workflow>
    </trackingProfile> 
    

    请注意,您必须主动指定要跟踪的查询和状态,否则默认情况下不会跟踪它们。如果您只想跟踪特定活动,还可以指定活动的名称。

    编辑:

    其他可能的解决方案是难以记住的解决方案之一,但很可能是您的问题所在。检查 TrackingProfile 的 ImplementationVisibility 属性,默认为 RootScope。设置为ImplementationVisibility.All:

    new TrackingProfile
    {
        ImplementationVisibility = ImplementationVisibility.All,
        Queries = ...
    }
    

    备注:

    如果 implementationVisibility 是 RootScope 并且复合活动是 不是工作流的根活动,只有顶级活动 在复合活动中进行跟踪。当设置为 RootScope 时,此 标志禁止跟踪不属于的活动的记录 从工作流的根目录可见。只有根活动及其 跟踪执行情况。如果实现包含活动 是复合活动,然后跟踪复合活动 但不是它的实现。

    【讨论】:

    • 我已将参与者的创作添加到我的问题中。当您说“您必须主动指定要跟踪的查询和状态”时,这是否意味着您不能指定“*”,所有状态?基本上,我们希望将所有跟踪信息转储到数据库中以供以后处理。
    • 您可以使用"*"。如果您想跟踪所有内容,您应该使用它,当然。
    • 好的。正如您在上面的代码中看到的那样,我认为我已将其设置为跟踪几乎所有内容。但是,我的“内部”工作流程仍然没有发出跟踪记录。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-14
    • 2010-12-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多