Esempio n. 1
0
        private void Dispatch(MessageDispatch dispatch, List <IMessageHandlerInvoker> invokers)
        {
            switch (_status)
            {
            case Status.Stopped:
                throw new InvalidOperationException("MessageDispatcher is stopped");

            case Status.Stopping:
                if (dispatch.IsLocal)
                {
                    break;
                }

                throw new InvalidOperationException("MessageDispatcher is stopping");
            }

            if (invokers.Count == 0)
            {
                dispatch.SetIgnored();
                return;
            }

            dispatch.SetHandlerCount(invokers.Count);

            foreach (var invoker in invokers)
            {
                if (invoker.ShouldHandle(dispatch.Message))
                {
                    Dispatch(dispatch, invoker);
                }
            }
        }
Esempio n. 2
0
 public void RunOrEnqueue(MessageDispatch dispatch, IMessageHandlerInvoker invoker)
 {
     if (dispatch.ShouldRunSynchronously || IsCurrentDispatchQueue)
     {
         RunSingle(dispatch, invoker);
     }
     else
     {
         Enqueue(dispatch, invoker);
     }
 }
Esempio n. 3
0
        private void RunSingle(MessageDispatch dispatch, IMessageHandlerInvoker invoker)
        {
            if (!_isRunning)
            {
                return;
            }

            var batch = new Batch(1);

            batch.Add(new Entry(dispatch, invoker));

            RunBatch(batch);
        }
Esempio n. 4
0
        private static void DispatchSync(PipeInvocation invocation, MessageDispatch dispatch)
        {
            Exception exception = null;

            try
            {
                invocation.Run();
            }
            catch (Exception ex)
            {
                exception = ex;
            }
            dispatch.SetHandled(invocation.Invoker, exception);
        }
Esempio n. 5
0
        private void Dispatch(MessageDispatch dispatch, IMessageHandlerInvoker invoker)
        {
            var context    = dispatch.Context.WithDispatchQueueName(invoker.DispatchQueueName);
            var invocation = _pipeManager.BuildPipeInvocation(invoker, dispatch.Message, context);

            var isInSameDispatchQueue = ShouldRunInCurrentDispatchQueue(invoker.DispatchQueueName, dispatch.Context.DispatchQueueName);

            if (invoker.CanInvokeSynchronously && (dispatch.ShouldRunSynchronously || isInSameDispatchQueue))
            {
                DispatchSync(invocation, dispatch);
            }
            else
            {
                DispatchAsync(invocation, dispatch);
            }
        }
Esempio n. 6
0
        private void Dispatch(MessageDispatch dispatch, List <IMessageHandlerInvoker> invokers)
        {
            if (!_isRunning)
            {
                throw new InvalidOperationException("MessageDispatcher is stopped");
            }

            if (invokers.Count == 0)
            {
                dispatch.SetIgnored();
                return;
            }

            dispatch.SetHandlerCount(invokers.Count);

            foreach (var invoker in invokers)
            {
                Dispatch(dispatch, invoker);
            }
        }
Esempio n. 7
0
        private void DispatchAsync(PipeInvocation invocation, MessageDispatch dispatch)
        {
            var invocationTask = invocation.RunAsync();

            invocationTask.ContinueWith(task => dispatch.SetHandled(invocation.Invoker, GetException(task)), TaskContinuationOptions.ExecuteSynchronously);

            if (invocationTask.Status != TaskStatus.Created)
            {
                return;
            }

            if (invocation.Invoker.ShouldCreateStartedTasks)
            {
                var exception = new InvalidProgramException($"{invocation.Invoker.MessageHandlerType.Name}.Handle({invocation.Invoker.MessageType.Name}) did not start the returned task");
                dispatch.SetHandled(invocation.Invoker, exception);
                return;
            }

            var taskScheduler = GetTaskScheduler(invocation.Invoker.DispatchQueueName);

            invocationTask.Start(taskScheduler);
        }
Esempio n. 8
0
        public void Dispatch(MessageDispatch dispatch)
        {
            if (!_isRunning)
            {
                throw new InvalidOperationException("MessageDispatcher is stopped");
            }

            var invokers = _invokers.GetValueOrDefault(dispatch.Message.TypeId(), _emptyInvokers)
                           .Where(dispatch.ShouldInvoke)
                           .ToList();

            if (invokers.Count == 0)
            {
                dispatch.SetIgnored();
                return;
            }

            dispatch.SetHandlerCount(invokers.Count);

            foreach (var invoker in invokers)
            {
                Dispatch(dispatch, invoker);
            }
        }
Esempio n. 9
0
        private void Dispatch(MessageDispatch dispatch, List<IMessageHandlerInvoker> invokers)
        {
            if (!_isRunning)
                throw new InvalidOperationException("MessageDispatcher is stopped");

            if (invokers.Count == 0)
            {
                dispatch.SetIgnored();
                return;
            }

            dispatch.SetHandlerCount(invokers.Count);

            foreach (var invoker in invokers)
            {
                Dispatch(dispatch, invoker);
            }
        }
Esempio n. 10
0
 public void Dispatch(MessageDispatch dispatch, Func<Type, bool> handlerFilter)
 {
     var invokers = _invokers.GetValueOrDefault(dispatch.Message.TypeId(), _emptyInvokers).Where(x => handlerFilter(x.MessageHandlerType)).ToList();
     Dispatch(dispatch, invokers);
 }
Esempio n. 11
0
 public void Dispatch(MessageDispatch dispatch)
 {
     var invokers = _invokers.GetValueOrDefault(dispatch.Message.TypeId(), _emptyInvokers);
     Dispatch(dispatch, invokers);
 }
Esempio n. 12
0
        private void Dispatch(IMessage message, MessageContext context, MessageDispatcher dispatcher = null)
        {
            _dispatchResultRef = null;

            var dispatch = new MessageDispatch(context, message, (x, r) => _dispatchResultRef = new DispatchResultRef(r));
            (dispatcher ?? _messageDispatcher).Dispatch(dispatch);
        }
Esempio n. 13
0
        public void should_get_reply_code()
        {
            _messageDispatcher.LoadMessageHandlerInvokers();

            var context = MessageContext.CreateTest("u.name");
            var dispatch = new MessageDispatch(context.WithDispatchQueueName(DispatchQueueNameScanner.DefaultQueueName), new ReplyCommand(), (x, r) => { });
            _messageDispatcher.Dispatch(dispatch);

            context.ReplyCode.ShouldEqual(ReplyCommand.ReplyCode);
        }
Esempio n. 14
0
        public void should_filter_invoker()
        {
            _messageDispatcher.LoadMessageHandlerInvokers();

            var asyncHandler = new AsyncCommandHandler();
            _containerMock.Setup(x => x.GetInstance(typeof(AsyncCommandHandler))).Returns(asyncHandler);

            var syncHandler = new SyncCommandHandler();
            _containerMock.Setup(x => x.GetInstance(typeof(SyncCommandHandler))).Returns(syncHandler);

            var context = MessageContext.CreateTest("u.name");
            var command = new DispatchCommand();
            var dispatched = new ManualResetEvent(false);
            var dispatch = new MessageDispatch(context, command, (x, r) => dispatched.Set());
            _messageDispatcher.Dispatch(dispatch, x => x == typeof(AsyncCommandHandler));

            dispatched.WaitOne(500.Milliseconds()).ShouldBeTrue();

            syncHandler.Called.ShouldBeFalse();
            asyncHandler.CalledSignal.IsSet.ShouldBeTrue();
        }
Esempio n. 15
0
        public void Dispatch(MessageDispatch dispatch)
        {
            var invokers = _invokers.GetValueOrDefault(dispatch.Message.TypeId(), _emptyInvokers);

            Dispatch(dispatch, invokers);
        }
Esempio n. 16
0
        public void Dispatch(MessageDispatch dispatch, Func <Type, bool> handlerFilter)
        {
            var invokers = _invokers.GetValueOrDefault(dispatch.Message.TypeId(), _emptyInvokers).Where(x => handlerFilter(x.MessageHandlerType)).ToList();

            Dispatch(dispatch, invokers);
        }
Esempio n. 17
0
        private void Dispatch(MessageDispatch dispatch, IMessageHandlerInvoker invoker)
        {
            var dispatchQueue = _dispatchQueues.GetOrAdd(invoker.DispatchQueueName, CreateAndStartDispatchQueue);

            dispatchQueue.RunOrEnqueue(dispatch, invoker);
        }
Esempio n. 18
0
        private void Dispatch(MessageDispatch dispatch, IMessageHandlerInvoker invoker)
        {
            var dispatchQueue = _dispatchQueues[invoker.DispatchQueueName];

            dispatchQueue.RunOrEnqueue(dispatch, invoker);
        }
Esempio n. 19
0
        private void Dispatch(MessageDispatch dispatch, IMessageHandlerInvoker invoker)
        {
            var context = dispatch.Context.WithDispatchQueueName(invoker.DispatchQueueName);
            var invocation = _pipeManager.BuildPipeInvocation(invoker, dispatch.Message, context);

            var isInSameDispatchQueue = ShouldRunInCurrentDispatchQueue(invoker.DispatchQueueName, dispatch.Context.DispatchQueueName);

            if (invoker.CanInvokeSynchronously && (dispatch.ShouldRunSynchronously || isInSameDispatchQueue))
                DispatchSync(invocation, dispatch);
            else
                DispatchAsync(invocation, dispatch);
        }
Esempio n. 20
0
 public Entry(MessageDispatch dispatch, IMessageHandlerInvoker invoker)
 {
     Dispatch = dispatch;
     Invoker  = invoker;
     Action   = null;
 }
Esempio n. 21
0
        private void DispatchAsync(PipeInvocation invocation, MessageDispatch dispatch)
        {
            var invocationTask = invocation.RunAsync();
            invocationTask.ContinueWith(task => dispatch.SetHandled(invocation.Invoker, GetException(task)), TaskContinuationOptions.ExecuteSynchronously);

            if (invocationTask.Status != TaskStatus.Created)
                return;

            if (invocation.Invoker.ShouldCreateStartedTasks)
            {
                var exception = new InvalidProgramException(string.Format("{0}.Handle({1}) did not start the returned task", invocation.Invoker.MessageHandlerType.Name, invocation.Invoker.MessageType.Name));
                dispatch.SetHandled(invocation.Invoker, exception);
                return;
            }

            var taskScheduler = GetTaskScheduler(invocation.Invoker.DispatchQueueName);
            invocationTask.Start(taskScheduler);
        }
Esempio n. 22
0
 public void Enqueue(MessageDispatch dispatch, IMessageHandlerInvoker invoker)
 {
     _queue.Add(new Entry(dispatch, invoker));
 }
Esempio n. 23
0
 private static void DispatchSync(PipeInvocation invocation, MessageDispatch dispatch)
 {
     Exception exception = null;
     try
     {
         invocation.Run();
     }
     catch (Exception ex)
     {
         exception = ex;
     }
     dispatch.SetHandled(invocation.Invoker, exception);
 }