我创建了一个执行一项特定任务的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 = { "*" }
},
}
}
};
答案 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活动及其 跟踪实施情况。如果实现包含活动 这是复合活动,然后跟踪复合活动 但不是它的实施。