2014-07-15 101 views
0

我创建了一个执行一项特定任务的Windows Workflow 4工作流程。这些需求随着软件开发的变化而变化,现在工作流需要多次完成这项任务。Windows工作流中的子活动未发出跟踪数据

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

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

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

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

我所有的问题都归结为您使用的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时,此 标志会禁止从工作流的根目录可看到非 的活动的跟踪记录。跟踪只有根活动和其实施。如果实施包含作为组合活动的活动 ,则会跟踪 而不是其实施。

+0

我已将参与者的创作添加到我的问题中。当你说“你必须主动指定你想要跟踪的查询和状态”这是否意味着你不能指定“*”,所有状态?基本上我们想把所有的跟踪信息转储到数据库中以备以后处理。 –

+0

您可以使用'“*”'。你*应该*使用它,如果你想追踪一切,当然。 – Joao

+0

好的。正如你在上面的代码中看到的那样,我认为我已经设置了几乎所有的事情。但是,我的“内在”工作流程仍然没有排出跟踪记录。 –