public void Run()
            {
                DateTime currentTime = DateTime.Now;

                foreach (KeyValuePair <object, MessageBarrier <T, K> > entry in _outer._barriers)
                {
                    if (currentTime - entry.Value.Timestamp >= _outer._timeout)
                    {
                        MessageBarrier <T, K> barrier = entry.Value;
                        lock (barrier) {
                            _outer.RemoveBarrier(entry.Key);
                            if (_outer._sendPartialResultOnTimeout)
                            {
                                barrier.SetComplete();
                                _outer.ProcessBarrier(barrier);
                            }
                            else
                            {
                                foreach (IMessage message in barrier.Messages.Values)
                                {
                                    if (_outer.logger.IsDebugEnabled)
                                    {
                                        _outer.logger.Debug("Handling of Message group with correlationId '" + entry.Key + "' has timed out.");
                                    }
                                    _outer.DiscardMessage(message);
                                }
                            }
                        }
                    }
                }
            }
        protected override void ProcessBarrier(MessageBarrier <IDictionary <object, IMessage>, object> barrier)
        {
            IList <IMessage> messageList = new List <IMessage>(barrier.Messages.Values);

            if (!barrier.IsComplete && messageList.Count > 0)
            {
                if (_completionStrategy.IsComplete(messageList))
                {
                    barrier.SetComplete();
                }
            }
            if (barrier.IsComplete)
            {
                RemoveBarrier(barrier.CorrelationId);
                IMessage result = AggregateMessages(messageList);
                if (result != null)
                {
                    if (result.Headers.CorrelationId == null)
                    {
                        result = MessageBuilder.FromMessage(result).SetCorrelationId(barrier.CorrelationId).Build();
                    }
                    SendReply(result, ResolveReplyChannelFromMessage(messageList[0]));
                }
            }
        }
コード例 #3
0
        protected override void ProcessBarrier(MessageBarrier <SortedDictionary <int, IMessage>, int> barrier)
        {
            if (HasReceivedAllMessages(barrier.Messages))
            {
                barrier.SetComplete();
            }
            IList <IMessage> releasedMessages = ReleaseAvailableMessages(barrier);

            if (releasedMessages != null && releasedMessages.Count > 0)
            {
                IMessage lastMessage = releasedMessages[releasedMessages.Count - 1];
                if (lastMessage.Headers.SequenceNumber.Equals(lastMessage.Headers.SequenceSize - 1))
                {
                    RemoveBarrier(barrier.CorrelationId);
                }
                SendReplies(releasedMessages, ResolveReplyChannelFromMessage(releasedMessages[0]));
            }
        }