コード例 #1
0
        /// <summary>
        /// Write any data changes to the BAM activity. This must be called after any property changes.
        /// </summary>
        public void CommitMessagingStepActivity()
        {
            // We need to provide the key/value pairs to the BAM API
            var al = new List <object>();

            foreach (var kvp in _activityItems)
            {
                al.Add(kvp.Key);
                al.Add(kvp.Value);
            }

            // Update the BAM Activity with all of the data
            EventStream es = _eventStream;

            es.UpdateActivity(ActivityName, _activityId, al.ToArray());
            es.Flush();
        }
        /// <summary>
        /// implements the IRelatedBAMActivitiesTracker Execute method
        /// </summary>
        /// <param name="context">pipeline context</param>
        /// <param name="msg">IBaseMessage</param>
        /// <param name="eventStream">the eventstream for writing BAM data</param>
        /// <param name="PrimaryActivityName">the primary BAM activity name</param>
        /// <param name="PrimaryActivityID">the primary BAM activity ID</param>
        /// <param name="RelatedActivityName">the related BAM activity name</param>
        /// <param name="BAMPropertyEventSources">a list of BAM activity event source</param>
        /// <param name="BAMPropertyEventSourceValues">a list of BAM activity event source values</param>
        /// <param name="PostprocessXPathEventSources">a list of xpath for post-processing</param>
        /// <param name="EnableContinuation">if related activity should be enabled</param>
        /// <param name="UseContinuation">if related activity should use continuation</param>
        public void Execute(IPipelineContext context
                            , IBaseMessage msg
                            , ref EventStream eventStream
                            , string PrimaryActivityName
                            , string PrimaryActivityID
                            , string RelatedActivityName
                            , List <BAMPropertyEventSource> BAMPropertyEventSources
                            , Dictionary <string, object> BAMPropertyEventSourceValues
                            , List <BAMPropertyEventSource> PostprocessXPathEventSources
                            , bool EnableContinuation
                            , bool UseContinuation
                            )
        {
            var callToken = TraceProvider.Logger.TraceIn(this.GetType().FullName);

            try
            {
                if (BAMPropertyEventSources != null && BAMPropertyEventSources.Count > 0)
                {
                    if (eventStream != null)
                    {
                        List <object> eventData = new List <object>();

                        var relatedXpathEventSources = from propertySource in BAMPropertyEventSources
                                                       where propertySource.Source.Equals(BAMPropertyEventSourceSource.XPath)
                                                       select propertySource;

                        if (relatedXpathEventSources.Count() == 1 &&
                            relatedXpathEventSources.First().ActivityItem.Equals(BAMTrackerFact.RELATED_ACTIVITY_XPATH_ROOT_SOURCE) &&
                            BAMPropertyEventSourceValues.ContainsKey(BAMTrackerFact.RELATED_ACTIVITY_XPATH_ROOT_SOURCE))
                        {
                            #region --------------- handle multiple related activities creation ---------------

                            var activitySource = (XPathNavigator)BAMPropertyEventSourceValues[BAMTrackerFact.RELATED_ACTIVITY_XPATH_ROOT_SOURCE];
                            Dictionary <string, string> xpathQueries = new Dictionary <string, string>();

                            PostprocessXPathEventSources.ToList().ForEach(x => xpathQueries.Add(x.ActivityItem, x.Value));
                            Dictionary <string, object> xpathValues = GetXPathValues(activitySource, xpathQueries);

                            for (int valueIndex = 0; valueIndex < ((List <object>)xpathValues.First().Value).Count; valueIndex++)
                            {
                                var           originalRelatedId = string.Concat(PrimaryActivityID, "/", valueIndex);
                                var           relatedId         = string.Concat(PrimaryActivityID, "/", valueIndex);
                                List <object> relatedEventData  = new List <object>();

                                relatedEventData.Add("PrimaryActivityId");
                                relatedEventData.Add(PrimaryActivityID);

                                foreach (var xpathQuery in xpathQueries)
                                {
                                    var itemValue = xpathValues.ContainsKey(xpathQuery.Key) && ((List <object>)xpathValues[xpathQuery.Key]).Count > 0
                                                        ? ((List <object>)xpathValues[xpathQuery.Key])[valueIndex]
                                                        : null;
                                    if (itemValue != null)
                                    {
                                        relatedEventData.Add(xpathQuery.Key);
                                        relatedEventData.Add(itemValue);
                                    }
                                }

                                if (BAMPropertyEventSources != null && BAMPropertyEventSources.Count() > 0)
                                {
                                    foreach (var eventsource in BAMPropertyEventSources)
                                    {
                                        if (!eventsource.Source.Equals(BAMPropertyEventSourceSource.XPath))
                                        {
                                            if (BAMPropertyEventSourceValues.ContainsKey(eventsource.ActivityItem))
                                            {
                                                relatedEventData.Add(eventsource.ActivityItem);
                                                relatedEventData.Add(BAMPropertyEventSourceValues[eventsource.ActivityItem]);
                                            }
                                        }
                                    }
                                }

                                #region start BAM Activity

                                // if using continuation, open activity with the continuation ID
                                if (UseContinuation)
                                {
                                    relatedId = CONTINUATION_PREFIX + originalRelatedId;
                                }
                                else
                                {
                                    TraceProvider.Logger.TraceInfo("Opening activity [{0}] with ID: {1}...", RelatedActivityName, relatedId);
                                    eventStream.BeginActivity(RelatedActivityName, relatedId);
                                }

                                #endregion start BAM Activity

                                #region update BAM Activity

                                TraceProvider.Logger.TraceInfo("Writing event data to activity [{0}] with ID: {1}...", RelatedActivityName, relatedId);
                                // write BAM data
                                eventStream.UpdateActivity(RelatedActivityName, relatedId, relatedEventData.ToArray());

                                #endregion update BAM Activity

                                #region BAM Activity Continuation

                                // check if we need to enable continuation
                                if (EnableContinuation == true && UseContinuation != true)
                                {
                                    string continuationToken = CONTINUATION_PREFIX + originalRelatedId;
                                    TraceProvider.Logger.TraceInfo("Enabling continuation on activity [{0}] with ID: {1} using continuation token: {2}...", RelatedActivityName, relatedId, continuationToken);
                                    eventStream.EnableContinuation(RelatedActivityName, relatedId, continuationToken);
                                }

                                #endregion BAM Activity Continuation

                                #region end related BAM Activity

                                // end updates to activity
                                if (EnableContinuation == false || UseContinuation == false)
                                {
                                    eventStream.EndActivity(RelatedActivityName, relatedId);
                                }
                                eventStream.Flush();

                                #endregion end related BAM Activity

                                #region add related activity

                                eventStream.AddRelatedActivity(PrimaryActivityName, PrimaryActivityID, RelatedActivityName, relatedId);

                                #endregion add related activity

                                TraceProvider.Logger.TraceInfo("Finished writing to activity [{0}] with ID: {1}...", RelatedActivityName, relatedId);
                            }

                            #endregion --------------- handle multiple related activities creation ---------------
                        }
                        else
                        {
                            #region --------------- handle single related activity creation ---------------

                            var           originalRelatedId = string.Concat(PrimaryActivityID, "/", 0);
                            var           relatedId         = string.Concat(PrimaryActivityID, "/", 0);
                            List <object> relatedEventData  = new List <object>();

                            relatedEventData.Add("PrimaryActivityId");
                            relatedEventData.Add(PrimaryActivityID);

                            if (BAMPropertyEventSources != null && BAMPropertyEventSources.Count() > 0)
                            {
                                foreach (var eventsource in BAMPropertyEventSources)
                                {
                                    var itemValue = BAMPropertyEventSourceValues.ContainsKey(eventsource.ActivityItem)
                                                        ? BAMPropertyEventSourceValues[eventsource.ActivityItem]
                                                        : null;
                                    if (itemValue != null)
                                    {
                                        relatedEventData.Add(eventsource.ActivityItem);
                                        relatedEventData.Add(itemValue);
                                    }
                                }
                            }

                            #region start BAM Activity

                            // if using continuation, open activity with the continuation ID
                            if (UseContinuation)
                            {
                                relatedId = CONTINUATION_PREFIX + originalRelatedId;
                            }
                            else
                            {
                                TraceProvider.Logger.TraceInfo("Opening activity [{0}] with ID: {1}...", RelatedActivityName, relatedId);
                                eventStream.BeginActivity(RelatedActivityName, relatedId);
                            }

                            #endregion start BAM Activity

                            #region update BAM Activity

                            TraceProvider.Logger.TraceInfo("Writing event data to activity [{0}] with ID: {1}...", RelatedActivityName, relatedId);
                            // write BAM data
                            eventStream.UpdateActivity(RelatedActivityName, relatedId, relatedEventData.ToArray());

                            #endregion update BAM Activity

                            #region BAM Activity Continuation

                            // check if we need to enable continuation
                            if (EnableContinuation == true && UseContinuation != true)
                            {
                                string continuationToken = CONTINUATION_PREFIX + originalRelatedId;
                                TraceProvider.Logger.TraceInfo("Enabling continuation on activity [{0}] with ID: {1} using continuation token: {2}...", RelatedActivityName, relatedId, continuationToken);
                                eventStream.EnableContinuation(RelatedActivityName, relatedId, continuationToken);
                            }

                            #endregion BAM Activity Continuation

                            #region end related BAM Activity

                            // end updates to activity
                            if (EnableContinuation == false || UseContinuation == false)
                            {
                                eventStream.EndActivity(RelatedActivityName, relatedId);
                            }
                            eventStream.Flush();

                            #endregion end related BAM Activity

                            #region add related activity

                            eventStream.AddRelatedActivity(PrimaryActivityName, PrimaryActivityID, RelatedActivityName, relatedId);

                            #endregion add related activity

                            TraceProvider.Logger.TraceInfo("Finished writing to activity [{0}] with ID: {1}...", RelatedActivityName, relatedId);

                            #endregion --------------- handle single related activity creation ---------------
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                // put component name as a source information in this exception,
                // so the event log in message could reflect this
                ex.Source = this.GetType().FullName;
                TraceProvider.Logger.TraceError(ex);
                throw ex;
            }
            finally
            {
                TraceProvider.Logger.TraceOut(callToken, this.GetType().FullName);
            }
        }
コード例 #3
0
        /// <summary>
        /// Flush any buffered events.
        /// </summary>
        public void Flush()
        {
            EventStream es = _eventStream;

            es.Flush();
        }