Ejemplo n.º 1
0
        /// <summary>
        /// Add a subscription for a specific event
        /// </summary>
        /// <param name="eventType">EventType being subscribed to</param>
        /// <param name="localOnly">Specifies if subscription is only for local machine or global</param>
        /// <param name="methodBody">String containing the method body defining the filter</param>
        /// <param name="usingLibraries">List of using libraries which the method requires, null if none required</param>
        /// <param name="referencedAssemblies">List of referenced assemblies which the method requires, null if none required</param>
        public void AddSubscription(Guid eventType, bool localOnly, string methodBody, List <string> usingLibraries, List <string> referencedAssemblies)
        {
            ReturnCode rc;

            Subscription subscription = new Subscription();

            subscription.SubscriptionEventType = eventType;
            subscription.Subscribe             = true;
            subscription.LocalOnly             = localOnly;
            subscription.MethodBody            = methodBody;
            subscription.UsingLibraries        = usingLibraries;
            subscription.ReferencedAssemblies  = referencedAssemblies;

            WspEvent wspEvent = new WspEvent(Subscription.SubscriptionEvent, null, subscription.Serialize());

            publishMgr.Publish(wspEvent.SerializedEvent, out rc);

            Dictionary <string, Subscription> subscriptionFilter;

            if (subscriptions.TryGetValue(eventType, out subscriptionFilter) == false)
            {
                subscriptions[eventType] = new Dictionary <string, Subscription>();
            }

            subscriptions[eventType][methodBody] = subscription;
        }
Ejemplo n.º 2
0
        /// <summary>
        /// The OnNext is used to publish events using Rx
        /// </summary>
        /// <param name="wspEvent">The WspEvent being published</param>
        /// <param name="rc">Return code</param>
        public void OnNext(WspEvent wspEvent, out ReturnCode rc)
        {
            ThreadPriority threadPriority;

            WspEvent[] wspEvents = null;
            long       beginTick = DateTime.Now.Ticks;
            long       interceptorTicks;
            long       totalTicks;

            rc = ReturnCode.Success;

            threadPriority = Thread.CurrentThread.Priority;
            Thread.CurrentThread.Priority = ThreadPriority.Lowest;

            if (Interceptor.publishInterceptor != null)
            {
                try
                {
                    if (Interceptor.publishInterceptor(wspEvent, null, out wspEvents) == false)
                    {
                        return;
                    }
                }
                catch
                {
                }
            }

            interceptorTicks = DateTime.Now.Ticks - beginTick;

            if (wspEvents == null || wspEvents.Length == 0)
            {
                pubMgr.Publish(wspEvent.SerializedEvent, out rc);
            }
            else
            {
                for (int i = 0; i < wspEvents.Length; i++)
                {
                    pubMgr.Publish(wspEvents[i].SerializedEvent, out rc);
                }
            }

            totalTicks = DateTime.Now.Ticks - beginTick;

            if (totalTicks > expectedMaxLatency)
            {
                StackTrace    st = new StackTrace(true);
                StringBuilder sb = new StringBuilder();
                sb.Append("\nEventType = ");
                sb.Append(wspEvent.EventType.ToString());
                sb.Append("\nProcessID = ");
                sb.Append(Process.GetCurrentProcess().Id.ToString());
                sb.Append("\nManagedThreadID = ");
                sb.Append(Thread.CurrentThread.ManagedThreadId.ToString());
                sb.Append("\nAppDomain = ");
                sb.Append(AppDomain.CurrentDomain.ApplicationIdentity.FullName);
                sb.Append("\nStackTrace = ");
                sb.Append(st.ToString());

                EventLog.WriteEntry("WspEventRouter", "Event publish time threshold exceeded: " + sb.ToString(), EventLogEntryType.Warning);
            }

            Thread.CurrentThread.Priority = threadPriority;
        }