首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> 關於.NET

WF4.0 基礎篇(22):Tracking 追蹤機制完整解析與自訂實作

     編輯:關於.NET

WF4.0 追蹤系統由三大核心組件構成:追蹤記錄 (記錄事件)、追蹤配置檔 (篩選規則)、追蹤參與者 (處理輸出)。掌握此機制可建立完整的工作流監控、稽核與診斷體系。

核心類別速覽

TrackingRecord (抽象基類) - 內建記錄類型:TrackingRecord 階層

  • WorkflowInstanceRecord:工作流實例生命週期事件
  • ActivityStateRecord:活動狀態變更 (Executing, Closed, Faulted...)
  • CustomTrackingRecord:活動內自訂記錄 (context.Track())

TrackingProfile - 定義查詢條件:TrackingProfile 結構 三大查詢類型

  • ActivityStateQuery:活動狀態、變數/參數擷取 (States、Variables、Arguments)
  • WorkflowInstanceQuery:工作流實例狀態 (States 含 Started, Completed, Idle, Persisted...)
  • CustomTrackingQuery:自訂記錄篩選 (Name、ActivityName)

TrackingParticipant (抽象) - 覆寫 Track(TrackingRecord, TimeSpan) 處理記錄。TrackingParticipant 結構

完整自訂追蹤參與者實作

1. 自訂參與者類別 - 解析三種記錄類型並格式化輸出至 Console:

public class MyTrackingParticipant : TrackingParticipant
{
    protected override void Track(TrackingRecord record, TimeSpan timeout)
    {
        // 共同欄位
        Console.Write($"{Name} emitted: {record.GetType().Name} Level:{record.Level} #{record.RecordNumber}");

        // WorkflowInstanceRecord
        if (record is WorkflowInstanceRecord wir)
            Console.Write($" InstanceId:{wir.InstanceId} State:{wir.State}");

        // ActivityStateRecord
        if (record is ActivityStateRecord asr) {
            var vars = asr.Variables;
            if (vars.Count > 0) {
                Console.Write("\n\tVariables:");
                foreach (var v in vars) Console.Write($"\n\t\t{v.Key}={v.Value}");
            }
            Console.Write($"\n Activity:{asr.Activity.Name} State:{asr.State}");
        }

        // CustomTrackingRecord
        if (record is CustomTrackingRecord ctr && ctr.Data.Count > 0) {
            Console.Write("\n\tUser Data:");
            foreach (var d in ctr.Data) Console.Write($"\n\t\t{d.Key}={d.Value}");
        }
        Console.WriteLine();
    }
}

2. 定義追蹤配置檔 - 訂閱所有活動狀態、所有工作流實例狀態、所有自訂記錄:

public static TrackingParticipant GetTracking()
{
    var profile = new TrackingProfile { Name = "DemoProfile" };
    profile.Queries.Add(new CustomTrackingQuery { Name = "*", ActivityName = "*" });
    profile.Queries.Add(new WorkflowInstanceQuery { States = { "*" } });
    profile.Queries.Add(new ActivityStateQuery { ActivityName = "*", States = { "*" }, Variables = { "*" }, Arguments = { "*" } });

    var participant = new MyTrackingParticipant { TrackingProfile = profile };
    return participant;
}

3. 具備 CustomTrackingRecord 的活動:

public sealed class MyActivity : CodeActivity
{
    protected override void Execute(CodeActivityContext context)
    {
        Console.WriteLine("MyActivity Execute");
        var record = new CustomTrackingRecord("MyActivity_CustomRecord");
        record.Data.Add("wxd", 12345);
        record.Data.Add("wxwinter", "lzm");
        context.Track(record);
    }
}

實際運行與結果

工作流設計:測試流程

宿主註冊:

var app = new WorkflowApplication(new TestWorkflow());
app.Extensions.Add(MyTrackingTools.GetTracking());
app.Run();

Console 輸出結果:追蹤輸出

ETW 追蹤參與者

EtwTrackingParticipant 將記錄寫入 Windows 事件追蹤 (ETW),配合 AppFabric 等工具可將資料持久化至 SQL 資料庫,供企業級監控儀表板使用。EtwTrackingParticipant

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved