public RemotingResponse HandleRequest(IRequestHandlerContext context, RemotingRequest request) { var pullMessageRequest = _binarySerializer.Deserialize<PullMessageRequest>(request.Body); var messages = _messageService.GetMessages( pullMessageRequest.MessageQueue.Topic, pullMessageRequest.MessageQueue.QueueId, pullMessageRequest.QueueOffset, pullMessageRequest.PullMessageBatchSize); if (messages.Count() > 0) { var pullMessageResponse = new PullMessageResponse(messages); var responseData = _binarySerializer.Serialize(pullMessageResponse); return new RemotingResponse((int)PullStatus.Found, request.Sequence, responseData); } else { var pullRequest = new PullRequest( request.Sequence, pullMessageRequest, context, DateTime.Now, SuspendPullRequestMilliseconds, ExecutePullRequest, ExecutePullRequest, ExecuteReplacedPullRequest); _brokerController.SuspendedPullRequestManager.SuspendPullRequest(pullRequest); return null; } }
public RemotingResponse HandleRequest(IRequestHandlerContext context, RemotingRequest request) { var pullMessageRequest = _binarySerializer.Deserialize<PullMessageRequest>(request.Body); if (pullMessageRequest.QueueOffset < 0) { var lastConsumedQueueOffset = _offsetManager.GetQueueOffset( pullMessageRequest.MessageQueue.Topic, pullMessageRequest.MessageQueue.QueueId, pullMessageRequest.ConsumerGroup); var queueCurrentOffset = _messageService.GetQueueCurrentOffset( pullMessageRequest.MessageQueue.Topic, pullMessageRequest.MessageQueue.QueueId); var nextQueueOffset = lastConsumedQueueOffset + 1; if (lastConsumedQueueOffset == -1) { nextQueueOffset = queueCurrentOffset + 1; } var response = new PullMessageResponse(new QueueMessage[0], nextQueueOffset); var responseData = _binarySerializer.Serialize(response); return new RemotingResponse((int)PullStatus.NextOffsetReset, request.Sequence, responseData); } var messages = _messageService.GetMessages( pullMessageRequest.MessageQueue.Topic, pullMessageRequest.MessageQueue.QueueId, pullMessageRequest.QueueOffset, pullMessageRequest.PullMessageBatchSize); if (messages.Count() > 0) { var pullMessageResponse = new PullMessageResponse(messages); var responseData = _binarySerializer.Serialize(pullMessageResponse); return new RemotingResponse((int)PullStatus.Found, request.Sequence, responseData); } else { var pullRequest = new PullRequest( request.Sequence, pullMessageRequest, context, DateTime.Now, _brokerController.Setting.SuspendPullRequestMilliseconds, ExecutePullRequest, ExecutePullRequest, ExecuteReplacedPullRequest); _brokerController.SuspendedPullRequestManager.SuspendPullRequest(pullRequest); return null; } }
private void ExecutePullRequest(PullRequest pullRequest) { var consumerGroup = _brokerController.ConsumerManager.GetConsumerGroup(pullRequest.PullMessageRequest.ConsumerGroup); if (consumerGroup != null && consumerGroup.IsConsumerChannelActive(pullRequest.RequestHandlerContext.Channel.RemotingAddress)) { var pullMessageRequest = pullRequest.PullMessageRequest; var messages = _messageService.GetMessages( pullMessageRequest.MessageQueue.Topic, pullMessageRequest.MessageQueue.QueueId, pullMessageRequest.QueueOffset, pullMessageRequest.PullMessageBatchSize); var pullMessageResponse = new PullMessageResponse(messages); var responseData = _binarySerializer.Serialize(pullMessageResponse); var remotingResponse = new RemotingResponse(messages.Count() > 0 ? (int)PullStatus.Found : (int)PullStatus.NoNewMessage, pullRequest.RemotingRequestSequence, responseData); pullRequest.RequestHandlerContext.SendRemotingResponse(remotingResponse); } }