Exemple #1
0
            public void OnComplete()
            {
                if (Success)
                {
                    var result = new MessageStoreResult(
                        MessageLogRecord.MessageId,
                        MessageLogRecord.Code,
                        MessageLogRecord.Topic,
                        MessageLogRecord.QueueId,
                        MessageLogRecord.QueueOffset,
                        MessageLogRecord.CreatedTime,
                        MessageLogRecord.StoredTime,
                        MessageLogRecord.Tag);
                    var data     = MessageUtils.EncodeMessageStoreResult(result);
                    var response = RemotingResponseFactory.CreateResponse(RemotingRequest, data);

                    RequestHandlerContext.SendRemotingResponse(response);

                    if (SendMessageRequestHandler._notifyWhenMessageArrived)
                    {
                        SendMessageRequestHandler._suspendedPullRequestManager.NotifyNewMessage(MessageLogRecord.Topic, result.QueueId, result.QueueOffset);
                    }

                    SendMessageRequestHandler._brokerController.AddLatestMessage(result.MessageId, result.CreatedTime, result.StoredTime);
                }
                else
                {
                    var response = RemotingResponseFactory.CreateResponse(RemotingRequest, ResponseCode.Failed, Encoding.UTF8.GetBytes(SendMessageFailedText));
                    RequestHandlerContext.SendRemotingResponse(response);
                }
            }
Exemple #2
0
        public RemotingResponse HandleRequest(IRequestHandlerContext context, RemotingRequest remotingRequest)
        {
            var request = MessageUtils.DecodeSendMessageRequest(remotingRequest.Body);
            var message = request.Message;
            var queueId = request.QueueId;
            var queue   = _queueStore.GetQueue(message.Topic, queueId);

            if (queue == null)
            {
                throw new QueueNotExistException(message.Topic, queueId);
            }

            //消息写文件需要加锁,确保顺序写文件
            MessageStoreResult result = null;

            lock (_syncObj)
            {
                var queueOffset   = queue.NextOffset;
                var messageRecord = _messageStore.StoreMessage(queueId, queueOffset, message);
                queue.AddMessage(messageRecord.LogPosition);
                queue.IncrementNextOffset();
                result = new MessageStoreResult(messageRecord.MessageId, message.Code, message.Topic, queueId, queueOffset);
            }

            //如果需要立即通知所有消费者有新消息,则立即通知
            if (BrokerController.Instance.Setting.NotifyWhenMessageArrived)
            {
                _suspendedPullRequestManager.NotifyNewMessage(request.Message.Topic, result.QueueId, result.QueueOffset);
            }

            var data = MessageUtils.EncodeMessageStoreResult(result);

            return(RemotingResponseFactory.CreateResponse(remotingRequest, data));
        }
Exemple #3
0
        public static byte[] EncodeMessageStoreResult(MessageStoreResult result)
        {
            //code
            var messageCodeBytes = BitConverter.GetBytes(result.Code);

            //queueId
            var queueIdBytes = BitConverter.GetBytes(result.QueueId);

            //queueOffset
            var queueOffsetBytes = BitConverter.GetBytes(result.QueueOffset);

            //messageId
            var messageIdBytes       = Encoding.UTF8.GetBytes(result.MessageId);
            var messageIdLengthBytes = BitConverter.GetBytes(messageIdBytes.Length);

            //topic
            var topicBytes       = Encoding.UTF8.GetBytes(result.Topic);
            var topicLengthBytes = BitConverter.GetBytes(topicBytes.Length);

            return(Combine(
                       messageCodeBytes,
                       queueIdBytes,
                       queueOffsetBytes,
                       messageIdLengthBytes,
                       messageIdBytes,
                       topicLengthBytes,
                       topicBytes));
        }
Exemple #4
0
        public static byte[] EncodeMessageStoreResult(MessageStoreResult result)
        {
            //code
            var messageCodeBytes = BitConverter.GetBytes(result.Code);

            //queueId
            var queueIdBytes = BitConverter.GetBytes(result.QueueId);

            //queueOffset
            var queueOffsetBytes = BitConverter.GetBytes(result.QueueOffset);

            //messageId
            var messageIdBytes       = Encoding.UTF8.GetBytes(result.MessageId);
            var messageIdLengthBytes = BitConverter.GetBytes(messageIdBytes.Length);

            //topic
            var topicBytes       = Encoding.UTF8.GetBytes(result.Topic);
            var topicLengthBytes = BitConverter.GetBytes(topicBytes.Length);

            //tag
            var tagBytes = EmptyBytes;

            if (!string.IsNullOrEmpty(result.Tag))
            {
                tagBytes = Encoding.UTF8.GetBytes(result.Tag);
            }
            var tagLengthBytes = BitConverter.GetBytes(tagBytes.Length);

            //createdTimeTicks
            var createdTimeTicksBytes = BitConverter.GetBytes(result.CreatedTime.Ticks);
            //storedTimeTicks
            var storedTimeTicksBytes = BitConverter.GetBytes(result.StoredTime.Ticks);

            return(Combine(
                       messageCodeBytes,
                       queueIdBytes,
                       queueOffsetBytes,
                       messageIdLengthBytes,
                       messageIdBytes,
                       topicLengthBytes,
                       topicBytes,
                       tagLengthBytes,
                       tagBytes,
                       createdTimeTicksBytes,
                       storedTimeTicksBytes));
        }
Exemple #5
0
            public void OnComplete()
            {
                var result = new MessageStoreResult(
                    MessageLogRecord.MessageId,
                    MessageLogRecord.Code,
                    MessageLogRecord.Topic,
                    MessageLogRecord.QueueId,
                    MessageLogRecord.QueueOffset,
                    MessageLogRecord.Tag);
                var data     = MessageUtils.EncodeMessageStoreResult(result);
                var response = RemotingResponseFactory.CreateResponse(RemotingRequest, data);

                RequestHandlerContext.SendRemotingResponse(response);

                if (SendMessageRequestHandler._notifyWhenMessageArrived)
                {
                    SendMessageRequestHandler._suspendedPullRequestManager.NotifyNewMessage(MessageLogRecord.Topic, result.QueueId, result.QueueOffset);
                }
            }
 /// <summary>
 /// 发送结果
 /// </summary>
 /// <param name="sendStatus"></param>
 /// <param name="messageStoreResult"></param>
 /// <param name="errorMessage"></param>
 public SendResult(SendStatus sendStatus, MessageStoreResult messageStoreResult, string errorMessage)
 {
     SendStatus         = sendStatus;
     MessageStoreResult = messageStoreResult;
     ErrorMessage       = errorMessage;
 }
        private Dictionary <long, MessageStoreResult> SaveMessage(NotifyMessageRequest message, out Tgnet.FootChat.Push.Data.IDBMessage senderMessage)
        {
            if (message.Receivers != null)
            {
                var kind = _MessageService.GetMessageKind(message.MessageType, message.SessionType);
                Dictionary <long, MessageStoreResult> result;
                bool firstSave = false;
                switch (kind)
                {
                case MessageKind.User:
                    result = new Dictionary <long, MessageStoreResult>();
                    foreach (var receiver in message.Receivers)
                    {
                        var r = new MessageStoreResult
                        {
                            Message = _MessageService.SaveUserMessage(message.SessionType, message.Sender, receiver, message.Created, message.ContentType, message.Content, message.Extension, out firstSave)
                        };
                        r.IsInsert       = firstSave;
                        result[receiver] = r;
                    }
                    senderMessage = result.Values.Select(r => r.Message).FirstOrDefault();
                    return(result);

                case MessageKind.MuiltUser:
                    var muiltMessage = _MessageService.SaveMultiUserMessage(message.SessionType, message.SessionId, message.Sender, message.Created, message.ContentType, message.Content, message.Receivers, message.Extension, out firstSave);
                    result = message.Receivers.Distinct().ToDictionary(r => r, r => new MessageStoreResult
                    {
                        Message  = muiltMessage,
                        IsInsert = firstSave,
                    });
                    senderMessage = muiltMessage;
                    return(result);

                case MessageKind.Other:
                    result = new Dictionary <long, MessageStoreResult>();
                    switch (message.MessageType)
                    {
                    case MessageType.Once:
                    case MessageType.OnceAndOnce:
                        var onceMessage = _MessageService.SaveOnceMessage(message.SessionType, message.SessionId, message.Sender, message.Receivers, message.Created, message.ContentType, message.Content,
                                                                          MessageType.OnceAndOnce == message.MessageType, null, message.Extension);
                        foreach (var item in message.Receivers)
                        {
                            result[item] = new MessageStoreResult
                            {
                                Message  = onceMessage,
                                IsInsert = true,
                            };
                        }
                        break;

                    case MessageType.Online:
                        var onlineMessage = _MessageService.SaveOnlineMessage(message.SessionType, message.SessionId, message.Sender, message.Receivers, message.Created, message.ContentType, message.Content, null);
                        foreach (var item in message.Receivers)
                        {
                            result[item] = new MessageStoreResult
                            {
                                Message  = onlineMessage,
                                IsInsert = true,
                            };
                        }
                        break;
                    }
                    senderMessage = result.Values.Select(r => r.Message).FirstOrDefault();
                    return(result);
                }
            }
            senderMessage = null;
            return(new Dictionary <long, MessageStoreResult>());
        }