Windows工作流中的子活动不会释放跟踪数据

时间:2014-07-15 12:58:57

标签: workflow-foundation-4 workflow-foundation

我创建了一个执行一项特定任务的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 = { "*" }
        },
      }
    }
  };

1 个答案:

答案 0 :(得分:1)

我全部归结为您正在使用的Tracking Profile以及如何配置。

您的TrackingProfile查询可能只有WorkflowInstanceQuery,而且执行一项特定任务的工作流程是您的主要工作流程。 / p>

现在它是主要工作流程中的内部活动,您需要将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时,这个   flag禁止非活动的跟踪记录   从工作流的根目录可见。只有root活动及其   跟踪实施情况。如果实现包含活动   这是复合活动,然后跟踪复合活动   但不是它的实施。