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); } }
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)); }
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)); }
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)); }
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>()); }