Workflow Foundation 4.0 Tracking
Introduction
This post will guide you to use extensions for tracking Workflow events while it is executing the defined activities.This is useful for monitoring a workflow’s execution and for triggering external processing.
Tracking
In WF 4.0, tracking is accomplished through tracking participants, which are extensions that are derived
from the TrackingParticipant abstract class.
First of all to implement tracking extensions you need to inherit TrackingParticipant class and overrides the Track() method, which is where most of the work is done. When a trackable event occurs, the workflow instance will enumerate all the extensions and will call the Track() method in any that are derived from the TrackingParticipant base class.
A TrackingRecord is passed into the Track() method. This is an abstract class; the actual instance passed
in will be one of the following classes, which are derived from the TrackingRecord class:
• WorkflowInstanceRecord contains data about the workflow instance.
You can use this class to print the Workflow instance ID and Workflow instance state as shown in the below list of codes:
1: WorkflowInstanceRecord instance = record as WorkflowInstanceRecord;
2: if (instance != null)
3: {
4: Console.WriteLine(String.Format(" InstanceID: {0} State: {1}",instance.InstanceId, instance.State));
5: }
• BookmarkResumptionRecord contains data about the bookmark being resumed.
You can use this class to print the book mark name as shown in the below list of codes:
1: BookmarkResumptionRecord bookmark = record as BookmarkResumptionRecord;
2: if (bookmark != null)
3: {
4: Console.WriteLine(String.Format(" Bookmark {0} resumed",bookmark.BookmarkName));
5: }
• ActivityStateRecord contains data about a specific activity.
You can use this class to print information about activities hosted in the Workflow instance as shown in the below list of codes:
1: ActivityStateRecord activity = record as ActivityStateRecord;
2: if (activity != null)
3: {
4: IDictionary<String, object> variables = activity.Variables;
5: StringBuilder s = new StringBuilder();
6: if (variables.Count > 0)
7: {
8: s.AppendLine(" Variables:");
9: foreach (KeyValuePair<string, object> v in variables)
10: {
11: s.AppendLine(String.Format(" {0} Value: [{1}]",
12: v.Key, v.Value));
13: }
14: }
15: Console.WriteLine(String.Format(" Activity: {0} State: {1} {2}",
16: activity.Activity.Name, activity.State, s.ToString()));
17: }
• CustomTrackingRecord contains user-defined data.
You can use this class to print about user-defined data as shown in the below list of codes
1: CustomTrackingRecord user = record as CustomTrackingRecord;
2: if ((user != null) && (user.Data.Count > 0))
3: {
4: Console.WriteLine(String.Format(" User Data: {0}", user.Name));
5: foreach (string data in user.Data.Keys)
6: {
7: Console.WriteLine(String.Format(" {0} : {1}", data, user.Data[data]));
8: }
9: }
To use the tracking extension you should add the tracking extension to the Workflow instance as shown in the below list of codes
1: i.Extensions.Add(_tracking);
2: //where i is an instance of WorkflowApplication
3: //and _tracking is an instance of class that inherits TrackingParticipant class
Then you should set up the tracking extensions participants by using TrackingProfile collections, A TrackingProfile defines a collection of queries that specify which events are to be tracked by the associated tracking participant. These queries are used to determine if an event is trackable. The queries are stored in the Queries property, which is a collection of classes derived from the abstract TrackingQuery class. There are four derived classes that correspond to the four types of tracking records:
• WorkflowInstanceQuery
A WorkflowInstanceQuery is used to define the workflow instance events that should be tracked. These
are the process states that occur at the instance level such as Started, Completed, Unloaded, and so on, To do that you can write the below list of codes:
1: TrackingProfile = new TrackingProfile()
2: {
3: Name = "TrackingProfileName",
4: Queries =
5: {
6: // For instance data, only track the started and completed events
7: new WorkflowInstanceQuery()
8: {
9: States = { WorkflowInstanceStates.Started,WorkflowInstanceStates.Completed },
10: }
11: }
• BookmarkResumptionQuery
In a BookmarkResumptionQuery, you specify the name of the bookmark that you want to track whenever it is resumed. You can specify only a single bookmark in a query. If you want to track multiple bookmarks,
you should create multiple queries—one for each bookmark, To do that you can write the below list of codes:
1: TrackingProfile = new TrackingProfile()
2: {
3: Name = "TrackingProfileName",
4: Queries =
5: {
6: new BookmarkResumptionQuery()
7: {
8: Name = "GetAssignment"
9: }
10: }
• ActivityStateQuery
An ActivityStateQuery class specifies both the Name of the activity and the State collection (events) that
should be tracked. You can specify an asterisk (*) for either, which indicates that all activities and/or
states should be tracked, To do that you can write the below list of codes:
1: TrackingProfile = new TrackingProfile()
2: {
3: Name = "ListBoxTrackingProfile",
4: Queries =
5: {
6: // For activity data, track all states of the InvokeMethod
7: new ActivityStateQuery()
8: {
9: ActivityName = "InvokeMethod",
10: States = { "*" },
11: }
12: }
13: }
• CustomTrackingQuery
The CustomTrackingQuery specifies the ActivityName, which indicates the activity that generated the
CustomTrackingRecord and the Name property, which indicates the name given to the CustomTrackingRecord,You can specify an asterisk for either (or both) as the example, above does. When
both are set to *, it indicates that all user events should be tracked, you can do that by typing the below of codes:
1: TrackingProfile = new TrackingProfile()
2: {
3: Name = "ListBoxTrackingProfile",
4: Queries =
5: {
6: new CustomTrackingQuery()
7: {
8: Name = "*",
9: ActivityName = "*"
10: }
11: }
12: }
In this post we have understood the Tracking extension and we have learned how to use it also.now you can visit the orher posts about Workflow Foundation for here
I hope that helped.
2 Comments »
Leave a Reply
-
Archives
- May 2011 (2)
- January 2011 (2)
- December 2010 (1)
- September 2010 (8)
- August 2010 (1)
- March 2010 (1)
- November 2009 (1)
- October 2009 (3)
- September 2009 (2)
- August 2009 (1)
- July 2009 (7)
- June 2009 (10)
-
Categories
-
RSS
Entries RSS
Comments RSS


[...] by Workflow Foundation 4.0 Tracking « Mohammed Atef’s Technical blog | September 26, 2010 | [...]
Mohammed, thank you for this amazing overview!