public static Message ToMessage(byte[] buffer, string queue, string file, DateTime fileDate)
 {
     var filePack = Path.GetFileNameWithoutExtension(file).Split('+');
     var queuePack = queue.Split('\\');
     var message = new Message
     {
         Id = new MessageId
         {
             SourceInstanceId = new Guid(filePack[0]),
             MessageIdentifier = new Guid(filePack[1])
         },
         Queue = queuePack[0],
         SubQueue = (queuePack.Length > 1 && !string.IsNullOrEmpty(queuePack[1]) ? queuePack[1] : null),
         SentAt = fileDate,
     };
     using (var s = new MemoryStream(buffer))
     using (var r = new BinaryReader(s))
     {
         var capacity = r.ReadInt32();
         message.Headers = new NameValueCollection(capacity);
         for (var j = 0; j < capacity; j++)
             message.Headers.Add(r.ReadString(), r.ReadString());
         var count = r.ReadInt32();
         message.Data = r.ReadBytes(count);
     }
     return message;
 }
Beispiel #2
0
 public void Register(Message message)
 {
     _timeoutMessageIds.Write(writer =>
     {
         var timeToSend = XmlConvert.ToDateTime(message.Headers["time-to-send"], XmlDateTimeSerializationMode.Utc);
         _logger.DebugFormat("Registering message {0} to be sent at {1} on {2}", message.Id, timeToSend, _queue.QueueName);
         writer.Add(timeToSend, message.Id);
     });
 }
Beispiel #3
0
 public MessageEventArgs(string endpoint, Message message)
 {
     Endpoint = endpoint;
     Message = message;
 }
 private void TestEventUpdatesCorrectInstance(Action<IQueueManager> @event, Message message, string expectedInstanceName)
 {
     Setup();
     var e = new MessageEventArgs("localhost", message);
     _queueManager.Raise(@event, null, e);
     Assert.Equal(expectedInstanceName, _performanceMonitor.InstanceName);
 }
Beispiel #5
0
 public void MoveTo(string subqueue, Message message)
 {
     _queueManager.MoveTo(subqueue, message);
 }
Beispiel #6
0
 public static string InboundInstanceName(this IQueueManager queueManager, Message message)
 {
     return queueManager.InboundInstanceName(message.Queue, message.SubQueue);
 }
Beispiel #7
0
 public static string OutboundInstanceName(this string endpoint, Message message)
 {
     return string.Format("{0}/{1}/{2}", endpoint, message.Queue, message.SubQueue).TrimEnd(new char[] { '/' });
 }
        public void WhenSendingDuplicateMessageTwiceWillGetItOnlyOnce()
        {
            var msg = new Message
            {
                Id = MessageId.GenerateRandom(),
                Queue = "h",
                Data = Encoding.Unicode.GetBytes("hello"),
                SentAt = DateTime.Now
            };
            for (var i = 0; i < 2; i++)
            {
                var wait = new ManualResetEvent(false);
                var sender = new Sender
                {
                    Destination = "localhost",
                    Failure = exception => Assert.False(true),
                    Success = () => null,
                    Messages = new[] { msg },
                };
                sender.SendCompleted += () => wait.Set();
                sender.Send();
                wait.WaitOne();
            }

            using (var tx = new TransactionScope())
            {
                var message = _queueManager.Receive("h", null);
                Assert.Equal("hello", Encoding.Unicode.GetString(message.Data));
                tx.Complete();
            }

            using (var tx = new TransactionScope())
            {
                Assert.Throws<TimeoutException>(() => _queueManager.Receive("h", null, TimeSpan.Zero));
                tx.Complete();
            }
        }
Beispiel #9
0
 public MessageId Send(Uri uri, MessagePayload payload)
 {
     if (_waitingForAllMessagesToBeSent)
         throw new CannotSendWhileWaitingForAllMessagesToBeSentException("Currently waiting for all messages to be sent, so we cannot send. You probably have a race condition in your application.");
     EnsureEnlistment();
     var parts = uri.AbsolutePath.Substring(1).Split('/');
     var queue = parts[0];
     string subqueue = null;
     if (parts.Length > 1)
         subqueue = string.Join("/", parts.Skip(1).ToArray());
     var msgId = Guid.Empty;
     var destination = uri.Host;
     _queueStorage.Global(actions =>
     {
         msgId = actions.RegisterToSend(destination, queue, subqueue, payload, Enlistment.Id);
         actions.Commit();
     });
     var messageId = new MessageId
     {
         SourceInstanceId = _queueStorage.Id,
         MessageIdentifier = msgId
     };
     var message = new Message
     {
         Id = messageId,
         Data = payload.Data,
         Headers = payload.Headers,
         Queue = queue,
         SubQueue = subqueue
     };
     OnMessageQueuedForSend(new MessageEventArgs(destination, message));
     return messageId;
 }
Beispiel #10
0
 private void OnMessageReceived(Message message) { OnMessageReceived(new MessageEventArgs(null, message)); }
Beispiel #11
0
 private void OnMessageQueuedForReceive(Message message) { OnMessageQueuedForReceive(new MessageEventArgs(null, message)); }
Beispiel #12
0
        public void MoveTo(string subqueue, Message message)
        {
            AssertNotDisposedOrDisposing();
            EnsureEnlistment();
            _queueStorage.Global(actions =>
            {
                var queue = actions.GetQueue(message.Queue);
                var bookmark = queue.MoveTo(subqueue, (PersistentMessage)message);
                actions.RegisterUpdateToReverse(Enlistment.Id, bookmark, MessageStatus.ReadyToDeliver, message.SubQueue);
                actions.Commit();
            });

            if (((PersistentMessage)message).Status == MessageStatus.ReadyToDeliver)
                OnMessageReceived(message);

            var updatedMessage = new Message
            {
                Id = message.Id,
                Data = message.Data,
                Headers = message.Headers,
                Queue = message.Queue,
                SubQueue = subqueue,
                SentAt = message.SentAt
            };
            OnMessageQueuedForReceive(updatedMessage);
        }
Beispiel #13
0
 protected virtual IMessageAcceptance AcceptMessages(Message[] msgs)
 {
     var bookmarks = new List<MessageBookmark>();
     _queueStorage.Global(actions =>
     {
         foreach (var msg in _receivedMsgs.Filter(msgs, message => message.Id))
         {
             var queue = actions.GetQueue(msg.Queue);
             var bookmark = queue.Enqueue(msg);
             bookmarks.Add(bookmark);
         }
         actions.Commit();
     });
     return new MessageAcceptance(this, bookmarks, msgs, _queueStorage);
 }
Beispiel #14
0
 protected override IMessageAcceptance AcceptMessages(Message[] msgs)
 {
     throw new Exception("Cannot accept messages.");
 }
Beispiel #15
0
        public MessageBookmark Enqueue(Message message)
        {
            if (!Directory.Exists(_msgsPath))
                throw new QueueDoesNotExistsException(_queueName);
            if (!string.IsNullOrEmpty(message.SubQueue) && !Subqueues.Contains(message.SubQueue))
            {
                _actions.AddSubqueueTo(_queueName, message.SubQueue);
                _subqueues = _subqueues.Union(new[] { message.SubQueue }).ToArray();
            }
            var path = (string.IsNullOrEmpty(message.SubQueue) ? _msgsPath : Path.Combine(_msgsPath, message.SubQueue));
            if (!Directory.Exists(path))
                Directory.CreateDirectory(path);

            var messageStatus = MessageStatus.InTransit;
            var persistentMessage = (message as PersistentMessage);
            if (persistentMessage != null)
                messageStatus = persistentMessage.Status;

            var obj = new QueueMsg
            {
                data = message.Data,
                headers = message.Headers.ToQueryString(),
            };
            var path2 = Path.Combine(path, FileUtil.FromMessageId(message.Id, messageStatus.ToString()));
            File.WriteAllText(path2, JsonConvert.SerializeObject(obj));
            FileUtil.SetCreationTime(path2, message.SentAt);
            var bm = new MessageBookmark { Bookmark = path2, QueueName = _queueName };

            _logger.DebugFormat("Enqueuing msg to '{0}' with subqueue: '{1}'. Id: {2}", _queueName, message.SubQueue, message.Id);
            _changeNumberOfMessages(1);
            return bm;
        }