public void OnComplete() { if (Success) { var recordCount = BatchMessageLogRecord.Records.Count(); var messageResults = new List <BatchMessageItemResult>(); foreach (var record in BatchMessageLogRecord.Records) { messageResults.Add(new BatchMessageItemResult(record.MessageId, record.Code, record.QueueOffset, record.CreatedTime, record.StoredTime, record.Tag)); } var result = new BatchMessageStoreResult(Queue.Topic, Queue.QueueId, messageResults); var data = BatchMessageUtils.EncodeMessageStoreResult(result); var response = RemotingResponseFactory.CreateResponse(RemotingRequest, data); RequestHandlerContext.SendRemotingResponse(response); if (BatchSendMessageRequestHandler._notifyWhenMessageArrived && recordCount > 0) { BatchSendMessageRequestHandler._suspendedPullRequestManager.NotifyNewMessage(Queue.Topic, Queue.QueueId, BatchMessageLogRecord.Records.First().QueueOffset); } if (recordCount > 0) { var lastRecord = BatchMessageLogRecord.Records.Last(); BatchSendMessageRequestHandler._brokerController.AddLatestMessage(lastRecord.MessageId, lastRecord.CreatedTime, lastRecord.StoredTime); } } else { var response = RemotingResponseFactory.CreateResponse(RemotingRequest, ResponseCode.Failed, Encoding.UTF8.GetBytes(SendMessageFailedText)); RequestHandlerContext.SendRemotingResponse(response); } }
private RemotingRequest BuildBatchSendMessageRequest(IEnumerable <Message> messages, int queueId, BrokerConnection brokerConnection) { var request = new BatchSendMessageRequest { Messages = messages, QueueId = queueId, ProducerAddress = brokerConnection.RemotingClient.LocalEndPoint.ToAddress() }; var data = BatchMessageUtils.EncodeSendMessageRequest(request); if (data.Length > Setting.MessageMaxSize * messages.Count()) { throw new Exception("Message size cannot exceed max message size:" + Setting.MessageMaxSize); } return(new RemotingRequest((int)BrokerRequestCode.BatchSendMessage, data)); }
public static BatchSendResult ParseBatchSendResult(RemotingResponse remotingResponse) { Ensure.NotNull(remotingResponse, "remotingResponse"); if (remotingResponse.ResponseCode == ResponseCode.Success) { var result = BatchMessageUtils.DecodeMessageStoreResult(remotingResponse.ResponseBody); return(new BatchSendResult(SendStatus.Success, result, null)); } else if (remotingResponse.ResponseCode == 0) { return(new BatchSendResult(SendStatus.Timeout, null, Encoding.UTF8.GetString(remotingResponse.ResponseBody))); } else { return(new BatchSendResult(SendStatus.Failed, null, Encoding.UTF8.GetString(remotingResponse.ResponseBody))); } }
public RemotingResponse HandleRequest(IRequestHandlerContext context, RemotingRequest remotingRequest) { if (remotingRequest.Body.Length > _brokerController.Setting.MessageMaxSize) { throw new Exception("Message size cannot exceed max message size:" + _brokerController.Setting.MessageMaxSize); } if (BrokerController.Instance.IsCleaning) { throw new BrokerCleanningException(); } var request = BatchMessageUtils.DecodeSendMessageRequest(remotingRequest.Body); var messages = request.Messages; if (messages.Count() == 0) { throw new ArgumentException("Invalid batchSendMessage, message list cannot be blank."); } var topic = messages.First().Topic; var queueId = request.QueueId; var queue = _queueStore.GetQueue(topic, queueId); if (queue == null) { throw new QueueNotExistException(topic, queueId); } _messageStore.BatchStoreMessageAsync(queue, request.Messages, (batchRecord, parameter) => { var storeContext = parameter as StoreContext; if (batchRecord.Records.Any(x => x.LogPosition < 0 || string.IsNullOrEmpty(x.MessageId))) { storeContext.Success = false; } else { foreach (var record in batchRecord.Records) { storeContext.Queue.AddMessage(record.LogPosition, record.Tag); } storeContext.BatchMessageLogRecord = batchRecord; storeContext.Success = true; } _bufferQueue.EnqueueMessage(storeContext); }, new StoreContext { RequestHandlerContext = context, RemotingRequest = remotingRequest, Queue = queue, BatchSendMessageRequestHandler = this }, request.ProducerAddress); foreach (var message in request.Messages) { _tpsStatisticService.AddTopicSendCount(topic, queueId); } return(null); }