예제 #1
0
        bool DoExecute(MessageResult ctx, IObserverHandler<IMessage> handler, AtomicInteger barrier)
        {
            var e = new MessageReceivingEventArgs (ctx, handler.Target);
            try
            {
                ListnerManager.OnReceiving(e);
                if (!e.Ignored)
                    ctx.results.Add(DelegateInvoker.Invoke<IMessage>(handler, ctx.Request.Sender, ctx.Request.ToMessage()));

                
                return true;
            }
            catch (Exception ex)
            {
                var re = new MessageExceptionEventArgs (ctx,ex);
                ListnerManager.OnReceivingException(re);
                ctx.InnerExceptions.Add(ex);
                return !re.Canceled; 
            }
            finally
            {
                barrier--;

                if (barrier == 0)
                {
                    ListnerManager.OnReceived(new MessageEventArgs(ctx));
                    ListnerManager.OnSent(e);
                    OnCompleted(ctx);
                }
                else
                    ListnerManager.OnReceived(new MessageEventArgs(ctx));
                
                e = null;
            }
        }
예제 #2
0
 public void Unsubscribe(IObserverHandler<IMessage> handler)
 {
     if (handler == null
         || !observers.ContainsKey(handler))
         return;
     lock (observers)
     {
         //ListnerManager.OnObserverRemoving(handler.Target, Name, Type);
         observers.Remove(handler);
         //ListnerManager.OnObserverRemoved(handler.Target, Name, Type);
     }
 }
예제 #3
0
 public void Unsubscribe(IObserverHandler <IMessage> handler)
 {
     if (handler == null ||
         !observers.ContainsKey(handler))
     {
         return;
     }
     lock (observers)
     {
         //ListnerManager.OnObserverRemoving(handler.Target, Name, Type);
         observers.Remove(handler);
         //ListnerManager.OnObserverRemoved(handler.Target, Name, Type);
     }
 }
예제 #4
0
        public IDisposable Subscribe(SubscribeMode mode, IObserverHandler<IMessage> handler)
        {
            if (handler == null
               || observers.ContainsKey(handler))
                return Disposable.Empty;

            if (mode == SubscribeMode.Async)
                IsAsync = true;

            var observer = handler.Target;

            lock (observers)
            {
                //ListnerManager.OnObserverAdding(observer, Name, Type);
                observers.Add(handler, mode);
                //ListnerManager.OnObserverAdded(observer, Name, Type);
            }

            return Disposable.Create(() => Unsubscribe(handler));
        }
예제 #5
0
        bool DoExecute(MessageResult ctx, IObserverHandler <IMessage> handler, AtomicInteger barrier)
        {
            var e = new MessageReceivingEventArgs(ctx, handler.Target);

            try
            {
                ListnerManager.OnReceiving(e);
                if (!e.Ignored)
                {
                    ctx.results.Add(DelegateInvoker.Invoke <IMessage>(handler, ctx.Request.Sender, ctx.Request.ToMessage()));
                }


                return(true);
            }
            catch (Exception ex)
            {
                var re = new MessageExceptionEventArgs(ctx, ex);
                ListnerManager.OnReceivingException(re);
                ctx.InnerExceptions.Add(ex);
                return(!re.Canceled);
            }
            finally
            {
                barrier--;

                if (barrier == 0)
                {
                    ListnerManager.OnReceived(new MessageEventArgs(ctx));
                    ListnerManager.OnSent(e);
                    OnCompleted(ctx);
                }
                else
                {
                    ListnerManager.OnReceived(new MessageEventArgs(ctx));
                }

                e = null;
            }
        }
예제 #6
0
        public IDisposable Subscribe(SubscribeMode mode, IObserverHandler <IMessage> handler)
        {
            if (handler == null ||
                observers.ContainsKey(handler))
            {
                return(Disposable.Empty);
            }

            if (mode == SubscribeMode.Async)
            {
                IsAsync = true;
            }

            var observer = handler.Target;

            lock (observers)
            {
                //ListnerManager.OnObserverAdding(observer, Name, Type);
                observers.Add(handler, mode);
                //ListnerManager.OnObserverAdded(observer, Name, Type);
            }

            return(Disposable.Create(() => Unsubscribe(handler)));
        }
예제 #7
0
 /// <summary>
 /// 
 /// </summary>
 /// <param name="topic">消息主题</param>
 /// <param name="messageType"></param>
 /// <param name="handler">处理器</param>
 public void Unsubscribe(string topic, Type messageType, IObserverHandler<IMessage> handler)
 {
     Repository[topic, messageType].Subscriber.Unsubscribe(handler);
 }
예제 #8
0
 public object Invoke <TMessage>(IObserverHandler <TMessage> handler, object sender, TMessage msg) where TMessage : IMessage
 {
     return(handler.Invoke(sender, msg));
 }
예제 #9
0
 /// <summary>
 ///
 /// </summary>
 /// <param name="topic">消息主题</param>
 /// <param name="messageType"></param>
 /// <param name="handler">处理器</param>
 public void Unsubscribe(string topic, Type messageType, IObserverHandler <IMessage> handler)
 {
     Repository[topic, messageType].Subscriber.Unsubscribe(handler);
 }
예제 #10
0
 /// <summary>
 ///
 /// </summary>
 /// <param name="handler"></param>
 public SubscribeInfo(IObserverHandler <IMessage> handler) : this(null, handler)
 {
 }
예제 #11
0
 /// <summary>
 ///
 /// </summary>
 /// <param name="messageType"></param>
 /// <param name="handler"></param>
 public SubscribeInfo(Type messageType, IObserverHandler <IMessage> handler)
 {
     MessageType = messageType;
     Handler     = handler;
 }
예제 #12
0
 /// <summary>
 /// 
 /// </summary>
 /// <param name="handler"></param>
 public SubscribeInfo(IObserverHandler<IMessage> handler) : this(null, handler) { }
예제 #13
0
 /// <summary>
 /// 
 /// </summary>
 /// <param name="messageType"></param>
 /// <param name="handler"></param>
 public SubscribeInfo(Type messageType, IObserverHandler<IMessage> handler)
 {
     MessageType = messageType;
     Handler = handler;
 }