0

Windows Workflow 4/4.5 を使用してさまざまなビジネス タスクを実行する作業を行っています。これらのタスクは、完了するまでにかなりの時間がかかります。ワークフローの進行状況をユーザーに表示できるようにしたいと考えています。

私の考えは、TFS ビルド出力に似たものを作成することでした。インデントを使用して、実行中のサブタスク、ログ出力などを表示します。

私の調査によると、カスタム追跡プロファイルを使用する必要があると思います。これを作成し、ActivityStateQuery と WorkflowInstanceQuery の 2 種類のクエリを処理するように指示しました。前者は、アクティビティの開始時と完了時、およびその他の状態に関する情報を提供してくれます。後者は、ワークフローの状態を示します。

これにより、必要な種類の情報が得られます。

このデータを 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>

この種の情報を取得する方法はありますか、またはこの種の追跡/ログ記録を行うためのより良い方法はありますか?

4

1 に答える 1

1

いくつかの試行錯誤と再考の後、私が望むタイプのアウトプットを達成することができました。

基本的に、ActivityStateQuery の状態で使用していたログを使用し続けました。

私が追加したのは、追跡プロファイルへの追加のクエリです。ActivityScheduledQuery を追加しました。ActivityScheduledRecord は、アクティビティと子アクティビティをスケジュールするアクティビティを提供します。これにより、親のノードの下に子のログ ノードを作成できます。子ノードの ActivityInfo オブジェクトの ID は、アクティビティが "Executing" 状態になったときの ID と一致し、ActivityStateQuery 中にログ メッセージと状態メッセージをリンクできます。

これは、追跡参加者オブジェクトの追跡プロファイルです。

TrackingProfile = new TrackingProfile
        {
          Queries = 
            {
                new ActivityStateQuery
                {
                    ActivityName = "*",
                    States = { "*" }
                },
                new WorkflowInstanceQuery
                {
                  States = { WorkflowInstanceStates.Started, WorkflowInstanceStates.Completed }
                },
                new ActivityScheduledQuery
                {
                  ActivityName = "*",
                  ChildActivityName = "*"
                }
            }
        }
于 2013-06-14T16:29:41.293 に答える