Megosztás:


Egyéni nyomon követés

A CustomTracking-minta bemutatja, hogyan hozhat létre egyéni nyomkövetési résztvevőt, és hogyan írhatja a követési adatok tartalmát a konzolra. A minta emellett bemutatja, hogyan bocsáthat ki CustomTrackingRecord felhasználó által megadott adatokkal feltöltött objektumokat. A konzolalapú nyomkövetési résztvevő egy TrackingRecord kódban létrehozott követőprofil-objektum használatával szűri a munkafolyamat által kibocsátott objektumokat.

Minta részletei

A Windows Workflow Foundation (WF) egy nyomkövetési infrastruktúrát biztosít a munkafolyamat-példányok végrehajtásának nyomon követéséhez. A nyomkövetési futtatókörnyezet implementál egy munkafolyamat-példányt, amely a munkafolyamat életciklusához kapcsolódó eseményeket, a munkafolyamat-tevékenységekből származó eseményeket és egyéni nyomon követési eseményeket bocsát ki. Az alábbi táblázat a nyomkövetési infrastruktúra elsődleges összetevőit ismerteti.

Összetevő Leírás
Futtatási idő nyomon követése Biztosítja a nyomkövetési rekordok kibocsátására szolgáló infrastruktúrát.
Résztvevők nyomon követése Felhasználja a nyomkövetési rekordokat. A .NET Framework 4 olyan nyomkövetési résztvevővel rendelkezik, aki a nyomkövetési rekordokat Eseménykövetés windowsos (ETW) eseményekként írja.
Nyomkövetési profil Olyan szűrési mechanizmus, amely lehetővé teszi, hogy a nyomkövetési résztvevő feliratkozzon a munkafolyamat-példányból kibocsátott nyomkövetési rekordok egy részhalmazára.

Az alábbi táblázat a munkafolyamat-futtatókörnyezet által kibocsátott nyomkövetési rekordokat ismerteti.

Nyomkövetési rekord Leírás
Munkafolyamat-példányok nyomkövetési rekordjai. A munkafolyamat-példány életciklusát ismerteti. Például, egy példányrekord jön létre, amikor a munkafolyamat elindul vagy befejeződik.
Tevékenységállapot-nyomkövetési rekordok. A tevékenységek végrehajtásának részletei. Ezek a rekordok egy munkafolyamat-tevékenység állapotát jelzik, például amikor egy tevékenység ütemezve van, vagy amikor a tevékenység befejeződött, vagy ha a rendszer hibát jelez.
Könyvjelző újrakezdési rekordja. A rendszer a munkafolyamat-példányon belüli könyvjelzők újraindításakor bocsátja ki.
Egyéni nyomkövetési rekordok. A munkafolyamat-szerzők létrehozhatnak egyéni nyomkövetési rekordokat, és kibocsáthatják őket az egyéni tevékenységen belül.

A nyomkövetési résztvevő feliratkozik a kibocsátott TrackingRecord objektumok egy részhalmazára nyomkövetési profilokkal. A nyomkövetési profil olyan nyomkövetési lekérdezéseket tartalmaz, amelyek lehetővé teszik a feliratkozást egy adott nyomkövetési rekordtípusra. A nyomkövetési profilok kódban vagy konfigurációban is megadhatóak.

Személyre szabott nyomkövetési résztvevő

A nyomkövetési résztvevő API lehetővé teszi a nyomkövetési futtatókörnyezet kiterjesztését egy felhasználó által megadott nyomkövetési résztvevővel, amely egyéni logikával kezelheti TrackingRecord a munkafolyamat-futtatókörnyezet által kibocsátott objektumokat.

Követő résztvevő írásához a felhasználónak implementálnia TrackingParticipantkell. Konkrétan az Track metódust az egyéni résztvevőnek kell implementálnia. Ezt a metódust akkor hívjuk meg, ha a munkafolyamat-futtatókörnyezet bocsát ki egy TrackingRecord értéket.

public abstract class TrackingParticipant
{
    protected TrackingParticipant();

    public virtual TrackingProfile TrackingProfile { get; set; }
    public abstract void Track(TrackingRecord record, TimeSpan timeout);
}

A teljes nyomkövetési résztvevő a ConsoleTrackingParticipant.cs fájlban van implementálva. Az alábbi példakód az Track egyéni nyomkövetési résztvevőhöz tartozó metódus.

protected override void Track(TrackingRecord record, TimeSpan timeout)
{
    ...
    WorkflowInstanceRecord workflowInstanceRecord = record as WorkflowInstanceRecord;
    if (workflowInstanceRecord != null)
    {
        Console.WriteLine(String.Format(CultureInfo.InvariantCulture,
            " Workflow InstanceID: {0} Workflow instance state: {1}",
            record.InstanceId, workflowInstanceRecord.State));
    }

    ActivityStateRecord activityStateRecord = record as ActivityStateRecord;
    if (activityStateRecord != null)
    {
        IDictionary<String, object> variables = activityStateRecord.Variables;
        StringBuilder vars = new StringBuilder();

        if (variables.Count > 0)
        {
            vars.AppendLine("\n\tVariables:");
            foreach (KeyValuePair<string, object> variable in variables)
            {
                vars.AppendLine(String.Format(
                    "\t\tName: {0} Value: {1}", variable.Key, variable.Value));
            }
        }
        Console.WriteLine(String.Format(CultureInfo.InvariantCulture,
            " :Activity DisplayName: {0} :ActivityInstanceState: {1} {2}",
                activityStateRecord.Activity.Name, activityStateRecord.State,
            ((variables.Count > 0) ? vars.ToString() : String.Empty)));
    }

    CustomTrackingRecord customTrackingRecord = record as CustomTrackingRecord;

    if ((customTrackingRecord != null) && (customTrackingRecord.Data.Count > 0))
    {
        ...
    }
    Console.WriteLine();

}

Az alábbi példakód hozzáadja a konzol résztvevőit a munkafolyamat-meghívóhoz.

ConsoleTrackingParticipant customTrackingParticipant = new ConsoleTrackingParticipant()
{
    ...
    // The tracking profile is set here, refer to Program.CS
...
}

WorkflowInvoker invoker = new WorkflowInvoker(BuildSampleWorkflow());
invoker.Extensions.Add(customTrackingParticipant);

Egyéni nyomkövetési rekordok kibocsátása

Ez a minta azt is bemutatja, hogy CustomTrackingRecord kibocsáthat-e objektumokat egy egyéni munkafolyamat-tevékenységből:

Az alábbi példa bemutatja, hogyan bocsáthat ki CustomTrackingRecord objektumokat egy egyéni tevékenységen belül.

// Create the Custom Tracking Record
CustomTrackingRecord customRecord = new CustomTrackingRecord("OrderIn")
{
    Data =
    {
        {"OrderId", 200},
        {"OrderDate", "20 Aug 2001"}
    }
};

// Emit custom tracking record
context.Track(customRecord);

A minta használata

  1. A Visual Studio használatával nyissa meg a CustomTrackingSample.sln megoldásfájlt.

  2. A megoldás létrehozásához nyomja le a CTRL+SHIFT+B billentyűkombinációt.

  3. A megoldás futtatásához nyomja le a CTRL+F5 billentyűkombinációt.

Lásd még