示例#1
0
            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);
                }
            }
示例#2
0
        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));
        }
示例#3
0
        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)));
            }
        }
示例#4
0
        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);
        }