public WorkflowTrackingRecord(TrackingWorkflowEvent trackingWorkflowEvent, DateTime eventDateTime, int eventOrder, EventArgs eventArgs) { _event = trackingWorkflowEvent; _eventDateTime = eventDateTime; _eventOrder = eventOrder; _args = eventArgs; }
internal bool TryTrackInstanceEvent(TrackingWorkflowEvent status, WorkflowTrackingRecord record) { bool track = false; foreach (WorkflowTrackPoint point in _profile.WorkflowTrackPoints) { if (point.IsMatch(status)) { record.Annotations.AddRange(point.Annotations); track = true; } } return(track); }
// Reading Data from Tracking Database static void QueryAndWriteTrackingInformationToConsole(Guid instanceId, TrackingWorkflowEvent workflowEventToFind) { SqlTrackingQuery sqlTrackingQuery = new SqlTrackingQuery(connectionString); SqlTrackingWorkflowInstance sqlTrackingWorkflowInstance; if (sqlTrackingQuery.TryGetWorkflow(instanceId, out sqlTrackingWorkflowInstance)) { foreach (WorkflowTrackingRecord workflowTrackingRecord in sqlTrackingWorkflowInstance.WorkflowEvents) { if (workflowTrackingRecord.TrackingWorkflowEvent == workflowEventToFind) { WriteEventDescriptionAndArgs(workflowTrackingRecord.TrackingWorkflowEvent.ToString(), workflowTrackingRecord.EventArgs, workflowTrackingRecord.EventDateTime); break; } } } }
private void NotifyChannels(TrackingWorkflowEvent evt, WorkflowExecutor.WorkflowExecutionEventArgs e, WorkflowExecutor exec) { DateTime utcNow = DateTime.UtcNow; int nextEventOrderId = this._broker.GetNextEventOrderId(); foreach (TrackingChannelWrapper wrapper in this._channels) { WorkflowExecutor.WorkflowExecutionTerminatingEventArgs args2; WorkflowTrackingRecord record; EventArgs eventArgs = null; switch (evt) { case TrackingWorkflowEvent.Exception: { WorkflowExecutor.WorkflowExecutionExceptionEventArgs args3 = (WorkflowExecutor.WorkflowExecutionExceptionEventArgs)e; eventArgs = new TrackingWorkflowExceptionEventArgs(args3.Exception, args3.CurrentPath, args3.OriginalPath, args3.ContextGuid, args3.ParentContextGuid); goto Label_00BC; } case TrackingWorkflowEvent.Terminated: args2 = (WorkflowExecutor.WorkflowExecutionTerminatingEventArgs)e; if (args2.Exception == null) { break; } eventArgs = new TrackingWorkflowTerminatedEventArgs(args2.Exception); goto Label_00BC; case TrackingWorkflowEvent.Suspended: eventArgs = new TrackingWorkflowSuspendedEventArgs(((WorkflowExecutor.WorkflowExecutionSuspendingEventArgs)e).Error); goto Label_00BC; default: goto Label_00BC; } eventArgs = new TrackingWorkflowTerminatedEventArgs(args2.Error); Label_00BC: record = new WorkflowTrackingRecord(evt, utcNow, nextEventOrderId, eventArgs); if (wrapper.GetTrackingProfile(exec).TryTrackInstanceEvent(evt, record)) { wrapper.TrackingChannel.Send(record); } } }
/// <summary> /// Toggles a tracked workflow event for the workflow trackpoint /// </summary> /// <param name="workflowEvent"></param> internal void ToggleEventStatus(TrackingWorkflowEvent workflowEvent) { if (WorkflowTrackPoint != null && WorkflowTrackPoint.MatchingLocation.Events.Contains(workflowEvent)) { WorkflowTrackPoint.MatchingLocation.Events.Remove(workflowEvent); if (TrackingProfile.WorkflowTrackPoints[0].MatchingLocation.Events.Count == 0) { TrackingProfile.WorkflowTrackPoints.Clear(); } } else { if (WorkflowTrackPoint == null) { TrackingProfile.WorkflowTrackPoints.Add(new WorkflowTrackPoint()); } WorkflowTrackPoint.MatchingLocation.Events.Add(workflowEvent); } }
internal bool TryTrackInstanceEvent(TrackingWorkflowEvent status, WorkflowTrackingRecord record) { bool track = false; foreach (WorkflowTrackPoint point in _profile.WorkflowTrackPoints) { if (point.IsMatch(status)) { record.Annotations.AddRange(point.Annotations); track = true; } } return track; }
internal bool Match(TrackingWorkflowEvent status) { return _events.Contains(status); }
private void NotifyChannels(TrackingWorkflowEvent evt, WorkflowExecutor.WorkflowExecutionEventArgs e, WorkflowExecutor exec) { DateTime utcNow = DateTime.UtcNow; int nextEventOrderId = this._broker.GetNextEventOrderId(); foreach (TrackingChannelWrapper wrapper in this._channels) { WorkflowExecutor.WorkflowExecutionTerminatingEventArgs args2; WorkflowTrackingRecord record; EventArgs eventArgs = null; switch (evt) { case TrackingWorkflowEvent.Exception: { WorkflowExecutor.WorkflowExecutionExceptionEventArgs args3 = (WorkflowExecutor.WorkflowExecutionExceptionEventArgs) e; eventArgs = new TrackingWorkflowExceptionEventArgs(args3.Exception, args3.CurrentPath, args3.OriginalPath, args3.ContextGuid, args3.ParentContextGuid); goto Label_00BC; } case TrackingWorkflowEvent.Terminated: args2 = (WorkflowExecutor.WorkflowExecutionTerminatingEventArgs) e; if (args2.Exception == null) { break; } eventArgs = new TrackingWorkflowTerminatedEventArgs(args2.Exception); goto Label_00BC; case TrackingWorkflowEvent.Suspended: eventArgs = new TrackingWorkflowSuspendedEventArgs(((WorkflowExecutor.WorkflowExecutionSuspendingEventArgs) e).Error); goto Label_00BC; default: goto Label_00BC; } eventArgs = new TrackingWorkflowTerminatedEventArgs(args2.Error); Label_00BC: record = new WorkflowTrackingRecord(evt, utcNow, nextEventOrderId, eventArgs); if (wrapper.GetTrackingProfile(exec).TryTrackInstanceEvent(evt, record)) { wrapper.TrackingChannel.Send(record); } } }
internal bool IsMatch(TrackingWorkflowEvent status) { return(_location.Match(status)); }
private void LoadWorkflowEventsFromReader(SqlDataReader reader, object parameter) { if (null == reader) { throw new ArgumentNullException("reader"); } // // There should always be 2 recordsets in this reader! // DateTime tmpMin = SqlDateTime.MinValue.Value; Dictionary <long, WorkflowTrackingRecord> inst = new Dictionary <long, WorkflowTrackingRecord>(); while (reader.Read()) { TrackingWorkflowEvent evt = (TrackingWorkflowEvent)reader[0]; DateTime dt = reader.GetDateTime(1); int order = reader.GetInt32(2); object tmp = null; EventArgs args = null; if (!reader.IsDBNull(3)) { BinaryFormatter formatter = new BinaryFormatter(); tmp = formatter.Deserialize(new MemoryStream((Byte[])reader[3])); if (tmp is EventArgs) { args = (EventArgs)tmp; } } long eventId = reader.GetInt64(4); DateTime dbDt = reader.GetDateTime(5); inst.Add(eventId, new WorkflowTrackingRecord(evt, dt, order, args)); if (dbDt > tmpMin) { tmpMin = dbDt; } } if (!reader.NextResult()) { throw new ArgumentException(ExecutionStringManager.InvalidWorkflowInstanceEventReader); } // // Add any annotations while (reader.Read()) { long eventId = reader.GetInt64(0); string annotation = null; if (!reader.IsDBNull(1)) { annotation = reader.GetString(1); } WorkflowTrackingRecord rec = null; if (inst.TryGetValue(eventId, out rec)) { if (null != rec) { rec.Annotations.Add(annotation); } } } if (!reader.IsClosed) { reader.Close(); } // // Check if we have any WorkflowChange events in this list // If so pull back the change actions and reconstruct the args property foreach (KeyValuePair <long, WorkflowTrackingRecord> kvp in inst) { WorkflowTrackingRecord rec = kvp.Value; if (TrackingWorkflowEvent.Changed != rec.TrackingWorkflowEvent) { continue; } SqlCommand cmd = new SqlCommand(); cmd.CommandType = CommandType.StoredProcedure; cmd.CommandText = "[dbo].[GetWorkflowChangeEventArgs]"; cmd.Parameters.Add(new SqlParameter("@WorkflowInstanceInternalId", _internalId)); cmd.Parameters.Add(new SqlParameter("@BeginDateTime", SqlDateTime.MinValue.Value)); cmd.Parameters.Add(new SqlParameter("@WorkflowInstanceEventId", kvp.Key)); ExecuteRetried(cmd, LoadWorkflowChangeEventArgsFromReader, rec); } _workflowEvents.AddRange(inst.Values); // // set the min for the next query to the most recent event from this query // Don't overwrite the previous min if nothing came back for this query if (tmpMin > SqlDateTime.MinValue.Value) { _instMinDT = tmpMin; } }
internal bool Match(TrackingWorkflowEvent status) { return(_events.Contains(status)); }
private void LoadWorkflowEventsFromReader(SqlDataReader reader, object parameter) { if (reader == null) { throw new ArgumentNullException("reader"); } DateTime time = SqlDateTime.MinValue.Value; Dictionary <long, WorkflowTrackingRecord> dictionary = new Dictionary <long, WorkflowTrackingRecord>(); while (reader.Read()) { TrackingWorkflowEvent trackingWorkflowEvent = (TrackingWorkflowEvent)reader[0]; DateTime dateTime = reader.GetDateTime(1); int eventOrder = reader.GetInt32(2); object obj2 = null; EventArgs eventArgs = null; if (!reader.IsDBNull(3)) { obj2 = new BinaryFormatter().Deserialize(new MemoryStream((byte[])reader[3])); if (obj2 is EventArgs) { eventArgs = (EventArgs)obj2; } } long key = reader.GetInt64(4); DateTime time3 = reader.GetDateTime(5); dictionary.Add(key, new WorkflowTrackingRecord(trackingWorkflowEvent, dateTime, eventOrder, eventArgs)); if (time3 > time) { time = time3; } } if (!reader.NextResult()) { throw new ArgumentException(ExecutionStringManager.InvalidWorkflowInstanceEventReader); } while (reader.Read()) { long num3 = reader.GetInt64(0); string item = null; if (!reader.IsDBNull(1)) { item = reader.GetString(1); } WorkflowTrackingRecord record = null; if (dictionary.TryGetValue(num3, out record) && (record != null)) { record.Annotations.Add(item); } } if (!reader.IsClosed) { reader.Close(); } foreach (KeyValuePair <long, WorkflowTrackingRecord> pair in dictionary) { WorkflowTrackingRecord loadFromReaderParam = pair.Value; if (TrackingWorkflowEvent.Changed == loadFromReaderParam.TrackingWorkflowEvent) { SqlCommand cmd = new SqlCommand { CommandType = CommandType.StoredProcedure, CommandText = "[dbo].[GetWorkflowChangeEventArgs]" }; cmd.Parameters.Add(new SqlParameter("@WorkflowInstanceInternalId", this._internalId)); cmd.Parameters.Add(new SqlParameter("@BeginDateTime", SqlDateTime.MinValue.Value)); cmd.Parameters.Add(new SqlParameter("@WorkflowInstanceEventId", pair.Key)); this.ExecuteRetried(cmd, new LoadFromReader(this.LoadWorkflowChangeEventArgsFromReader), loadFromReaderParam); } } this._workflowEvents.AddRange(dictionary.Values); if (time > SqlDateTime.MinValue.Value) { this._instMinDT = time; } }
internal bool IsMatch(TrackingWorkflowEvent status) { return _location.Match(status); }