我正在使用Windows Workflow 4 / 4.5来执行各种业务任务。这些任务需要相当长的时间才能完成。我希望能够向用户显示工作流程进度的视图。
我的想法是制作类似于TFS构建输出的东西。它使用缩进来显示执行的子任务,记录的输出等。
根据我的研究,我认为我应该使用自定义跟踪配置文件。我写了一个并指示它处理两种类型的查询,ActivityStateQuery和WorkflowInstanceQuery。前者向我提供有关活动何时开始和完成以及其他状态的信息。后者给出了工作流程状态的指示。
这让我了解了我想要的信息类型。
我想将这些数据放入XML文档中,然后使用XSL将其转换为HTML。我遇到的问题是我没有ActivityStateRecord的任何分层数据。我有一个活动,但是当Track方法执行时我不知道它的父。如果没有这种上下文,我不确定如何将活动的状态添加到XML文档。
调用Track方法时分配的活动ID使用'。'图案。我以为我可以使用它来计算层次结构,即1.5.8是一个父ID为1.5并且其父ID为1的活动。它似乎只是与当前正在执行的活动的关系,因为当我在其中放置活动时其他活动,如序列,ID不会超过单个'。'。当我这样做时,我得到以下XML结构:
<logs>
<log workflowInstanceId="bde36e74-0b39-4445-aac7-27f3e8cf5b1d">
<activity activityId="1" activityName="TestActivity1" activityTypeName="SumTotal.WorkflowInstaller.Tests.Resources.TestActivity1">
<status eventTime="2013-06-14T15:14:40.7847857Z" level="INFO">Executing: TestActivity1</status>
<activity activityId="1.1" activityName="Sequence" activityTypeName="System.Activities.Statements.Sequence">
<status eventTime="2013-06-14T15:14:53.3645053Z" level="INFO">Executing: Sequence</status>
<status eventTime="2013-06-14T15:15:23.5382311Z" level="INFO">Closed: Sequence</status>
</activity>
<activity activityId="1.11" activityName="Assign" activityTypeName="System.Activities.Statements.Assign">
<status eventTime="2013-06-14T15:14:54.9715972Z" level="INFO">Executing: Assign</status>
<status eventTime="2013-06-14T15:14:54.9715972Z" level="INFO">Closed: Assign</status>
</activity>
<activity activityId="1.7" activityName="Sequence" activityTypeName="System.Activities.Statements.Sequence">
<status eventTime="2013-06-14T15:14:58.2097824Z" level="INFO">Executing: Sequence</status>
<status eventTime="2013-06-14T15:15:14.410709Z" level="INFO">Closed: Sequence</status>
</activity>
<status eventTime="2013-06-14T11:15:14.409709-04:00" level="DEBUG">Log: Test1 value</status>
<activity activityId="1.2" activityName="Assign" activityTypeName="System.Activities.Statements.Assign">
<status eventTime="2013-06-14T15:15:18.7189555Z" level="INFO">Executing: Assign</status>
<status eventTime="2013-06-14T15:15:18.7189555Z" level="INFO">Closed: Assign</status>
</activity>
<status eventTime="2013-06-14T15:15:26.6104068Z" level="INFO">Closed: TestActivity1</status>
</activity>
</log>
</logs>
理想情况下,我想生成以下XML:
<logs>
<log workflowInstanceId="bde36e74-0b39-4445-aac7-27f3e8cf5b1d">
<activity activityId="1" activityName="TestActivity1" activityTypeName="SumTotal.WorkflowInstaller.Tests.Resources.TestActivity1">
<status eventTime="2013-06-14T15:14:40.7847857Z" level="INFO">Executing: TestActivity1</status>
<activity activityId="1.1" activityName="Sequence" activityTypeName="System.Activities.Statements.Sequence">
<status eventTime="2013-06-14T15:14:53.3645053Z" level="INFO">Executing: Sequence</status>
<activity activityId="1.11" activityName="Assign" activityTypeName="System.Activities.Statements.Assign">
<status eventTime="2013-06-14T15:14:54.9715972Z" level="INFO">Executing: Assign</status>
<status eventTime="2013-06-14T15:14:54.9715972Z" level="INFO">Closed: Assign</status>
</activity>
<activity activityId="1.7" activityName="Sequence" activityTypeName="System.Activities.Statements.Sequence">
<status eventTime="2013-06-14T15:14:58.2097824Z" level="INFO">Executing: Sequence</status>
<status eventTime="2013-06-14T11:15:14.409709-04:00" level="DEBUG">Log: Test1 value</status>
<status eventTime="2013-06-14T15:15:14.410709Z" level="INFO">Closed: Sequence</status>
</activity>
<activity activityId="1.2" activityName="Assign" activityTypeName="System.Activities.Statements.Assign">
<status eventTime="2013-06-14T15:15:18.7189555Z" level="INFO">Executing: Assign</status>
<status eventTime="2013-06-14T15:15:18.7189555Z" level="INFO">Closed: Assign</status>
</activity>
<status eventTime="2013-06-14T15:15:23.5382311Z" level="INFO">Closed: Sequence</status>
</activity>
<status eventTime="2013-06-14T15:15:26.6104068Z" level="INFO">Closed: TestActivity1</status>
</activity>
</log>
</logs>
有没有办法获取此类信息,还是有更好的方法来进行此类跟踪/记录?
答案 0 :(得分:1)
经过一番调整和重新思考后,我能够实现我想要的输出类型。
基本上我一直在使用我在ActivityStateQuery状态期间使用的日志记录。
我添加的是对跟踪配置文件的附加查询。我添加了一个ActivityScheduledQuery。 ActivityScheduledRecord提供调度活动和子活动的活动。这允许我在父节点下创建子节点的日志节点。当活动发生“正在执行”状态时,子节点的ActivityInfo对象上的id与id匹配,然后我可以在ActivityStateQuery期间链接日志消息和状态消息。
这是我的跟踪参与者对象的跟踪配置文件:
TrackingProfile = new TrackingProfile
{
Queries =
{
new ActivityStateQuery
{
ActivityName = "*",
States = { "*" }
},
new WorkflowInstanceQuery
{
States = { WorkflowInstanceStates.Started, WorkflowInstanceStates.Completed }
},
new ActivityScheduledQuery
{
ActivityName = "*",
ChildActivityName = "*"
}
}
}