示例#1
0
        private void PullMessage(PullRequest pullRequest)
        {
            try
            {
                if (_stoped)
                {
                    return;
                }
                if (pullRequest.IsDropped)
                {
                    return;
                }

                var messageCount         = 0;
                var flowControlThreshold = 0;

                if (Setting.AutoPull)
                {
                    messageCount         = pullRequest.ProcessQueue.GetMessageCount();
                    flowControlThreshold = Setting.PullMessageFlowControlThreshold;
                }
                else
                {
                    messageCount         = _pulledMessageQueue.Count;
                    flowControlThreshold = Setting.ManualPullLocalMessageQueueMaxSize;
                }

                if (messageCount > flowControlThreshold)
                {
                    var milliseconds = FlowControlUtils.CalculateFlowControlTimeMilliseconds(
                        messageCount,
                        flowControlThreshold,
                        Setting.PullMessageFlowControlStepPercent,
                        Setting.PullMessageFlowControlStepWaitMilliseconds);
                    Task.Factory.StartDelayedTask(milliseconds, () => SchedulePullRequest(pullRequest));
                    return;
                }

                var request = new PullMessageRequest
                {
                    ConsumerId                     = GetConsumerId(),
                    ConsumerGroup                  = GroupName,
                    MessageQueue                   = pullRequest.MessageQueue,
                    Tags                           = string.Join("|", pullRequest.Tags),
                    QueueOffset                    = pullRequest.NextConsumeOffset,
                    PullMessageBatchSize           = Setting.PullMessageBatchSize,
                    SuspendPullRequestMilliseconds = Setting.SuspendPullRequestMilliseconds,
                    ConsumeFromWhere               = Setting.ConsumeFromWhere
                };
                var data            = SerializePullMessageRequest(request);
                var remotingRequest = new RemotingRequest((int)RequestCode.PullMessage, data);

                pullRequest.PullStartTime = DateTime.Now;
                _remotingClient.InvokeAsync(remotingRequest, Setting.PullRequestTimeoutMilliseconds).ContinueWith(pullTask =>
                {
                    try
                    {
                        if (_stoped)
                        {
                            return;
                        }
                        if (pullRequest.IsDropped)
                        {
                            return;
                        }

                        if (pullTask.Exception != null)
                        {
                            _logger.Error(string.Format("Pull message failed, pullRequest:{0}", pullRequest), pullTask.Exception);
                            SchedulePullRequest(pullRequest);
                            return;
                        }

                        ProcessPullResponse(pullRequest, pullTask.Result, pulledMessages =>
                        {
                            var filterMessages    = pulledMessages.Where(x => IsQueueMessageMatchTag(x, pullRequest.Tags));
                            var consumingMessages = filterMessages.Select(x => new ConsumingMessage(x, pullRequest)).ToList();

                            if (Setting.AutoPull)
                            {
                                pullRequest.ProcessQueue.AddMessages(consumingMessages);
                                foreach (var consumingMessage in consumingMessages)
                                {
                                    if (Setting.MessageHandleMode == MessageHandleMode.Sequential)
                                    {
                                        _consumingMessageQueue.Add(consumingMessage);
                                    }
                                    else
                                    {
                                        Task.Factory.StartNew(HandleMessage, consumingMessage);
                                    }
                                }
                            }
                            else
                            {
                                foreach (var consumingMessage in consumingMessages)
                                {
                                    _pulledMessageQueue.Add(consumingMessage.Message);
                                }
                            }
                        });
                    }
                    catch (Exception ex)
                    {
                        if (_stoped)
                        {
                            return;
                        }
                        if (pullRequest.IsDropped)
                        {
                            return;
                        }
                        if (_remotingClient.IsConnected)
                        {
                            string remotingResponseBodyLength;
                            if (pullTask.Result != null)
                            {
                                remotingResponseBodyLength = pullTask.Result.Body.Length.ToString();
                            }
                            else
                            {
                                remotingResponseBodyLength = "pull message result is null.";
                            }
                            _logger.Error(string.Format("Process pull result has exception, pullRequest:{0}, remotingResponseBodyLength:{1}", pullRequest, remotingResponseBodyLength), ex);
                        }
                        SchedulePullRequest(pullRequest);
                    }
                });
            }
            catch (Exception ex)
            {
                if (_stoped)
                {
                    return;
                }
                if (pullRequest.IsDropped)
                {
                    return;
                }

                if (_remotingClient.IsConnected)
                {
                    _logger.Error(string.Format("PullMessage has exception, pullRequest:{0}", pullRequest), ex);
                }
                SchedulePullRequest(pullRequest);
            }
        }
示例#2
0
 public ConsumingMessage(QueueMessage message, PullRequest pullRequest)
 {
     Message     = message;
     PullRequest = pullRequest;
 }
示例#3
0
 private void SchedulePullRequest(PullRequest pullRequest)
 {
     Task.Factory.StartNew(ExecutePullRequest, pullRequest);
 }