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); } }
public ConsumingMessage(QueueMessage message, PullRequest pullRequest) { Message = message; PullRequest = pullRequest; }
private void SchedulePullRequest(PullRequest pullRequest) { Task.Factory.StartNew(ExecutePullRequest, pullRequest); }