private void PurgeOutgoingHistory()
        {
            // Outgoing messages are still stored in the history in case the sender
            // needs to revert, so there will still be messages to purge even when
            // the QueueManagerConfiguration has disabled outgoing history.
            //
            // To make this batchable:
            // 1: Move to the end of the history (to the newest messages) and seek
            //    backword by NumberOfMessagesToKeepInOutgoingHistory.
            // 2: Save a bookmark of the current position.
            // 3: Delete from the beginning of the table (oldest messages) in batches until
            //    a) we reach the bookmark or b) we hit OldestMessageInOutgoingHistory.

            MessageBookmark purgeLimit             = null;
            int             numberOfMessagesToKeep = Configuration.NumberOfMessagesToKeepInOutgoingHistory;

            if (numberOfMessagesToKeep > 0 && Configuration.EnableOutgoingMessageHistory)
            {
                queueStorage.Global(actions =>
                {
                    purgeLimit = actions.GetSentMessageBookmarkAtPosition(numberOfMessagesToKeep);
                    actions.Commit();
                });

                if (purgeLimit == null)
                {
                    return;
                }
            }

            bool foundMessages = false;

            do
            {
                foundMessages = false;
                queueStorage.Global(actions =>
                {
                    IEnumerable <PersistentMessageToSend> sentMessages = actions.GetSentMessages(batchSize: 250)
                                                                         .TakeWhile(x => (purgeLimit == null || !x.Bookmark.Equals(purgeLimit)) &&
                                                                                    (!Configuration.EnableOutgoingMessageHistory || (DateTime.Now - x.SentAt) > Configuration.OldestMessageInOutgoingHistory));

                    foreach (var sentMessage in sentMessages)
                    {
                        foundMessages = true;
                        logger.DebugFormat("Purging sent message {0} to {1}/{2}/{3}", sentMessage.Id, sentMessage.Endpoint,
                                           sentMessage.Queue, sentMessage.SubQueue);
                        actions.DeleteMessageToSendHistoric(sentMessage.Bookmark);
                    }

                    actions.Commit();
                });
            } while (foundMessages);
        }
        private void PurgeProcessedMessagesInQueue(string queue)
        {
            // To make this batchable:
            // 1: Move to the end of the history (to the newest messages) and seek
            //    backword by NumberOfMessagesToKeepInProcessedHistory.
            // 2: Save a bookmark of the current position.
            // 3: Delete from the beginning of the table (oldest messages) in batches until
            //    a) we reach the bookmark or b) we hit OldestMessageInProcessedHistory.
            MessageBookmark purgeLimit             = null;
            int             numberOfMessagesToKeep = Configuration.NumberOfMessagesToKeepInProcessedHistory;

            if (numberOfMessagesToKeep > 0)
            {
                queueStorage.Global(actions =>
                {
                    var queueActions = actions.GetQueue(queue);
                    purgeLimit       = queueActions.GetMessageHistoryBookmarkAtPosition(numberOfMessagesToKeep);
                    actions.Commit();
                });

                if (purgeLimit == null)
                {
                    return;
                }
            }

            bool foundMessages = false;

            do
            {
                foundMessages = false;
                queueStorage.Global(actions =>
                {
                    var queueActions = actions.GetQueue(queue);
                    var messages     = queueActions.GetAllProcessedMessages(batchSize: 250)
                                       .TakeWhile(x => (purgeLimit == null || !x.Bookmark.Equals(purgeLimit)) &&
                                                  (DateTime.Now - x.SentAt) > Configuration.OldestMessageInProcessedHistory);

                    foreach (var message in messages)
                    {
                        foundMessages = true;
                        logger.DebugFormat("Purging message {0} from queue {1}/{2}", message.Id, message.Queue, message.SubQueue);
                        queueActions.DeleteHistoric(message.Bookmark);
                    }

                    actions.Commit();
                });
            } while (foundMessages);
        }
        public void CanPutSingleMessageInQueue()
        {
            using (var qf = CreateQueueStorage())
            {
                qf.Initialize();

                qf.Global(actions =>
                {
                    actions.CreateQueueIfDoesNotExists("h");
                    actions.Commit();
                });

                MessageBookmark bookmark   = null;
                var             guid       = Guid.NewGuid();
                var             identifier = Guid.NewGuid();
                qf.Global(actions =>
                {
                    bookmark = actions.GetQueue("h").Enqueue(new Message
                    {
                        Queue  = "h",
                        Data   = new byte[] { 13, 12, 43, 5 },
                        SentAt = new DateTime(2004, 5, 5),
                        Id     = new MessageId {
                            SourceInstanceId = guid, MessageIdentifier = identifier
                        }
                    });
                    actions.Commit();
                });

                qf.Global(actions =>
                {
                    actions.GetQueue("h").SetMessageStatus(bookmark, MessageStatus.ReadyToDeliver);
                    actions.Commit();
                });

                qf.Global(actions =>
                {
                    var message = actions.GetQueue("h").Dequeue(null);

                    Assert.Equal(new byte[] { 13, 12, 43, 5 }, message.Data);
                    Assert.Equal(identifier, message.Id.MessageIdentifier);
                    Assert.Equal(guid, message.Id.SourceInstanceId);
                    Assert.Equal("h", message.Queue);
                    Assert.Equal(new DateTime(2004, 5, 5), message.SentAt);
                    actions.Commit();
                });
            }
        }
Example #4
0
 public MessageBookmark MarkOutgoingMessageAsSuccessfullySent(MessageBookmark bookmark)
 {
     var path = bookmark.Bookmark;
     if (!path.StartsWith(_outgoingPath))
         return null;
     if (!Directory.Exists(_outgoingHistoryPath))
         Directory.CreateDirectory(_outgoingHistoryPath);
     //var obj = JsonConvert.DeserializeObject<Outgoing>(File.ReadAllText(path));
     var msgId = "msgId"; //obj.msgId;
     var newBookmark = new MessageBookmark { Bookmark = FileUtil.MoveBase(path, _outgoingPath, _outgoingHistoryPath, OutgoingMessageStatus.Sent.ToString()) };
     _logger.DebugFormat("Successfully sent output message {0}", msgId);
     return newBookmark;
 }
Example #5
0
        public PersistentMessage Peek(string subQueue)
        {
            var path = (string.IsNullOrEmpty(subQueue) ? _msgsPath : Path.Combine(_msgsPath, subQueue));
            if (!Directory.Exists(path))
                return null;
            return Directory.EnumerateFiles(path, FileUtil.SearchMessageId(null, MessageStatus.ReadyToDeliver.ToString()))
                .OrderBy(x => x)
                .Select(x =>
                {
                    var id = FileUtil.ToMessageId(x);
                    var status = FileUtil.ParseExtension<MessageStatus>(x);
                    _logger.DebugFormat("Scanning incoming message {2} on '{0}/{1}' with status {3}", _queueName, subQueue, id, status);
                    if (status != MessageStatus.ReadyToDeliver)
                        return null;

                    var obj = JsonConvert.DeserializeObject<QueueMsg>(File.ReadAllText(x));
                    var bookmark = new MessageBookmark { Bookmark = x, QueueName = _queueName };
                    _logger.DebugFormat("Peeking message {2} from '{0}/{1}'", _queueName, subQueue, id);
                    return new PersistentMessage
                    {
                        Bookmark = bookmark,
                        Headers = HttpUtility.ParseQueryString(obj.headers),
                        Queue = _queueName,
                        SentAt = File.GetCreationTime(x),
                        Data = obj.data,
                        Id = id,
                        SubQueue = subQueue,
                        Status = status,
                    };
                })
                .FirstOrDefault();
        }
Example #6
0
 public void MarkOutgoingMessageAsFailedTransmission(MessageBookmark bookmark, bool queueDoesNotExistsInDestination)
 {
     var path = bookmark.Bookmark;
     if (!path.StartsWith(_outgoingPath) && !File.Exists(path))
         return;
     var obj = JsonConvert.DeserializeObject<Outgoing>(File.ReadAllText(path));
     var numOfRetries = obj.numberOfRetries;
     var msgId = obj.msgId;
     if (numOfRetries < 100 && !queueDoesNotExistsInDestination)
     {
         var timeToSend = DateTime.Now.AddSeconds(numOfRetries * numOfRetries);
         obj.timeToSend = timeToSend;
         obj.numberOfRetries++;
         File.WriteAllText(path, JsonConvert.SerializeObject(obj));
         bookmark.Bookmark = FileUtil.MoveExtension(path, OutgoingMessageStatus.Ready.ToString());
         _logger.DebugFormat("Marking outgoing message {0} as failed with retries: {1}", msgId, numOfRetries);
     }
     else
         MoveFailedMessageToOutgoingHistory(path, numOfRetries, msgId);
 }
        public void SetMessageStatus(MessageBookmark bookmark, MessageStatus status)
        {
            _messages.MoveTo(bookmark);
            var id = _messages.GetMessageId();

            _messages.Update(() => _messages.ForColumnType<IntColumn>().Set("status", (int)status));

            _logger.Debug("Changing message {0} status to {1} on {2}",
                               id, status, _queueName);
        }
 public void DeleteHistoric(MessageBookmark bookmark)
 {
     _messageHistory.MoveTo(bookmark);
     _messageHistory.Delete();
 }
Example #9
0
        public void RegisterUpdateToReverse(Guid txId, MessageBookmark bookmark, MessageStatus statusToRestore, string subQueue)
        {
            var actualBookmark = bookmark.Bookmark.Take(bookmark.Size).ToArray();
            var enumerator = txs.GetEnumerator(new BookmarkIndex(bookmark.Size, actualBookmark));

            if(enumerator.MoveNext())
            {
                txs.Delete();
            }

            txs.Insert(() =>
            {
                txs.ForColumnType<GuidColumn>().Set("tx_id", txId);
                txs.ForColumnType<IntColumn>().Set("bookmark_size", bookmark.Size);
                txs.ForColumnType<BytesColumn>().Set("bookmark_data", actualBookmark);
                txs.ForColumnType<IntColumn>().Set("value_to_restore", (int)statusToRestore);
                txs.ForColumnType<StringColumn>().Set("queue", bookmark.QueueName);
                txs.ForColumnType<StringColumn>().Set("subqueue", subQueue);
            });
        }
Example #10
0
 public void DeleteHistoric(MessageBookmark bookmark)
 {
     var path = bookmark.Bookmark;
     if (File.Exists(path) && path.StartsWith(_msgsHistoryPath))
         File.Delete(path);
 }
Example #11
0
        public PersistentMessage PeekById(MessageId id)
        {
            var path = _msgsPath;
            if (!Directory.Exists(path))
                return null;
            var msgsPathLength = _msgsPath.Length;
            return Directory.EnumerateFiles(path, FileUtil.SearchMessageId(id, MessageStatus.ReadyToDeliver.ToString()), SearchOption.AllDirectories)
                .OrderBy(x => x)
                .Select(x =>
                {
                    var subQueue = Path.GetDirectoryName(x).Substring(msgsPathLength);
                    var status = FileUtil.ParseExtension<MessageStatus>(x);
                    if (status != MessageStatus.ReadyToDeliver)
                        return null;

                    var obj = JsonConvert.DeserializeObject<QueueMsg>(File.ReadAllText(x));
                    var bookmark = new MessageBookmark { Bookmark = x, QueueName = _queueName };
                    return new PersistentMessage
                    {
                        Bookmark = bookmark,
                        Headers = HttpUtility.ParseQueryString(obj.headers),
                        Queue = _queueName,
                        SentAt = File.GetCreationTime(x),
                        Data = obj.data,
                        Id = id,
                        SubQueue = (string.IsNullOrEmpty(subQueue) ? null : subQueue),
                        Status = status,
                    };
                })
                .FirstOrDefault();
        }
Example #12
0
        public void ReverseAllFrom(Guid transactionId)
        {
            var enumerator = txs.GetEnumerator(new GuidIndex(transactionId, "by_tx_id"));

            while(enumerator.MoveNext())
            {
                var oldStatus = (MessageStatus) txs.ForColumnType<IntColumn>().Get("value_to_restore");
                var queue = txs.ForColumnType<StringColumn>().Get("queue");
                var subqueue = txs.ForColumnType<StringColumn>().Get("subqueue");

                var bookmark = new MessageBookmark
                {
                    QueueName = queue,
                    Bookmark = txs.ForColumnType<BytesColumn>().Get("bookmark_data"),
                    Size = txs.ForColumnType<IntColumn>().Get("bookmark_size")
                };
                var actions = GetQueue(queue);
                var newStatus = actions.GetMessageStatus(bookmark);
                switch (newStatus)
                {
                    case MessageStatus.SubqueueChanged:
                        actions.SetMessageStatus(bookmark, MessageStatus.ReadyToDeliver, subqueue);
                        break;
                    case MessageStatus.EnqueueWait:
                        actions.Delete(bookmark);
                        break;
                    default:
                        actions.SetMessageStatus(bookmark, oldStatus);
                        break;
                }
            }
        }
        public void RevertBackToSend(MessageBookmark[] bookmarks)
        {
            foreach (var bookmark in bookmarks)
            {
                outgoingHistory.MoveTo(bookmark);
                var msgId = outgoingHistory.ForColumnType<GuidColumn>().Get("msg_id");

                outgoing.Insert(() =>
                {
                    foreach (var column in ColumnsInformation.OutgoingColumns.Keys)
                    {
                        var bytes = outgoingHistory.ForColumnType<BytesColumn>().Get(column);
                        outgoing.ForColumnType<BytesColumn>().Set(column, bytes);
                    }
                    outgoing.ForColumnType<IntColumn>().Set("send_status", (int) OutgoingMessageStatus.Ready);
                    var previousRetry = outgoingHistory.ForColumnType<IntColumn>().Get("number_of_retries");
                    outgoing.ForColumnType<IntColumn>().Set("number_of_retries", previousRetry + 1);

                    _logger.Debug("Reverting output message {0} back to Ready mode", msgId);
                });
                outgoingHistory.Delete();
            }
        }
 private void revert(MessageBookmark[] sendHistoryBookmarks, IEnumerable<PersistentMessage> messages)
 {
     _queueStorage.Send(actions => actions.RevertBackToSend(sendHistoryBookmarks));
     failedToSend(messages);
 }
 public MessageBookmark MarkOutgoingMessageAsSuccessfullySent(MessageBookmark bookmark)
 {
     outgoing.MoveTo(bookmark);
     var newBookmark = outgoingHistory.Insert(() =>
     {
         foreach (var column in outgoing.ColumnNames)
         {
             var bytes = outgoing.ForColumnType<BytesColumn>().Get(column);
             outgoingHistory.ForColumnType<BytesColumn>().Set(column, bytes);
         }
         outgoingHistory.ForColumnType<IntColumn>().Set("send_status", (int)OutgoingMessageStatus.Sent);
     });
     var msgId = outgoing.ForColumnType<GuidColumn>().Get("msg_id");
     outgoing.Delete();
     _logger.Debug("Successfully sent output message {0}", msgId);
     return newBookmark;
 }
        public void MarkOutgoingMessageAsFailedTransmission(MessageBookmark bookmark, bool queueDoesNotExistsInDestination)
        {
            outgoing.MoveTo(bookmark);
            var numOfRetries = outgoing.ForColumnType<IntColumn>().Get("number_of_retries");
            var msgId = outgoing.ForColumnType<GuidColumn>().Get("msg_id");

            if (numOfRetries < 100 && queueDoesNotExistsInDestination == false)
            {
                outgoing.Update(() =>
                {
                    outgoing.ForColumnType<IntColumn>().Set("send_status", (int)OutgoingMessageStatus.Ready);
                    outgoing.ForColumnType<DateTimeColumn>().Set("time_to_send", DateTime.Now.AddSeconds(numOfRetries * numOfRetries));
                    outgoing.ForColumnType<IntColumn>().Set("number_of_retries", numOfRetries + 1);
                    _logger.Debug("Marking outgoing message {0} as failed with retries: {1}", msgId, numOfRetries);
                });
            }
            else
            {
                MoveFailedMessageToOutgoingHistory(numOfRetries, msgId);
            }
        }
Example #17
0
        public PersistentMessage Dequeue(string subQueue)
        {
            var path = (string.IsNullOrEmpty(subQueue) ? _msgsPath : Path.Combine(_msgsPath, subQueue));
            if (!Directory.Exists(path))
                throw new QueueDoesNotExistsException(_queueName);
            return Directory.EnumerateFiles(path, FileUtil.SearchMessageId(null, MessageStatus.ReadyToDeliver.ToString()))
                .OrderBy(x => x)
                .Select(x =>
                {
                    var id = FileUtil.ToMessageId(x);
                    var status = FileUtil.ParseExtension<MessageStatus>(x);
                    _logger.DebugFormat("Scanning incoming message {2} on '{0}/{1}' with status {3}", _queueName, subQueue, id, status);
                    if (status != MessageStatus.ReadyToDeliver)
                        return null;

                    var obj = JsonConvert.DeserializeObject<QueueMsg>(File.ReadAllText(x));
                    try { x = FileUtil.MoveExtension(x, MessageStatus.Processing.ToString()); }
                    catch (ErrorException e)
                    {
                        _logger.DebugFormat("Write conflict on '{0}/{1}' for {2}, skipping message", _queueName, subQueue, id);
                        if (e.Error == ErrorException.ErrorType.WriteConflict)
                            return null;
                        throw;
                    }
                    var bookmark = new MessageBookmark { Bookmark = x, QueueName = _queueName };
                    _changeNumberOfMessages(-1);

                    _logger.DebugFormat("Dequeuing message {2} from '{0}/{1}'", _queueName, subQueue, id);
                    return new PersistentMessage
                    {
                        Bookmark = bookmark,
                        Headers = HttpUtility.ParseQueryString(obj.headers),
                        Queue = _queueName,
                        SentAt = File.GetCreationTime(x),
                        Data = obj.data,
                        Id = id,
                        SubQueue = subQueue,
                        Status = status,
                    };
                })
                .Where(x => x != null)
                .FirstOrDefault();
        }
Example #18
0
        public void RevertBackToSend(MessageBookmark[] bookmarks)
        {
            foreach (var bookmark in bookmarks)
            {
                var path = bookmark.Bookmark;
                if (!path.StartsWith(_outgoingHistoryPath))
                    return;

                var obj = JsonConvert.DeserializeObject<Outgoing>(File.ReadAllText(path));
                var msgId = obj.msgId;
                obj.numberOfRetries++;
                _logger.DebugFormat("Reverting output message {0} back to Ready mode", msgId);
                File.WriteAllText(path, JsonConvert.SerializeObject(obj));
                bookmark.Bookmark = FileUtil.MoveBase(path, _outgoingHistoryPath, _outgoingPath, OutgoingMessageStatus.Ready.ToString());
            }
        }
 public void Discard(MessageBookmark bookmark)
 {
     Delete(bookmark);
 }
Example #20
0
        public IList<PersistentMessage> GetMessagesToSendAndMarkThemAsInFlight(int maxNumberOfMessage, int maxSizeOfMessagesInTotal, out string endPoint)
        {
            endPoint = null;
            if (!Directory.Exists(_outgoingPath))
                return Enumerable.Empty<PersistentMessage>().ToList();

            string queue = null;
            var messages = new List<PersistentMessage>();
            foreach (var path in Directory.EnumerateFiles(_outgoingPath, FileUtil.SearchMessageId(null, OutgoingMessageStatus.Ready.ToString())).OrderBy(x => x))
            {
                var obj = JsonConvert.DeserializeObject<Outgoing>(File.ReadAllText(path));
                var msgId = obj.msgId;
                var status = FileUtil.ParseExtension<OutgoingMessageStatus>(path);
                var time = obj.timeToSend;

                _logger.DebugFormat("Scanning message {0} with status {1} to be sent at {2}", msgId, status, time);
                if (status != OutgoingMessageStatus.Ready)
                    continue;

                // Check if the message has expired, and move it to the outgoing history.
                var deliverBy = obj.deliverBy;
                if (deliverBy != null && deliverBy.Value < DateTime.Now)
                {
                    _logger.InfoFormat("Outgoing message {0} was not succesfully sent by its delivery time limit {1}", msgId, deliverBy.Value);
                    var numOfRetries = obj.numberOfRetries;
                    MoveFailedMessageToOutgoingHistory(path, numOfRetries, msgId);
                    continue;
                }

                var maxAttempts = obj.maxAttempts;
                if (maxAttempts != null)
                {
                    var numOfRetries = obj.numberOfRetries;
                    if (numOfRetries > maxAttempts)
                    {
                        _logger.InfoFormat("Outgoing message {0} has reached its max attempts of {1}", msgId, maxAttempts);
                        MoveFailedMessageToOutgoingHistory(path, numOfRetries, msgId);
                        continue;
                    }
                }

                if (time > DateTime.Now)
                    continue;

                var rowEndpoint = obj.address;
                if (endPoint == null)
                    endPoint = rowEndpoint;
                if (!endPoint.Equals(rowEndpoint))
                    continue;

                var rowQueue = obj.queue;
                if (queue == null)
                    queue = rowQueue;
                if (queue != rowQueue)
                    continue;

                var bookmark = new MessageBookmark { Bookmark = FileUtil.MoveExtension(path, OutgoingMessageStatus.InFlight.ToString()) };
                _logger.DebugFormat("Adding message {0} to returned messages", msgId);
                messages.Add(new PersistentMessage
                {
                    Id = new MessageId
                    {
                        SourceInstanceId = _instanceId,
                        MessageIdentifier = msgId
                    },
                    Headers = HttpUtility.ParseQueryString(obj.headers),
                    Queue = rowQueue,
                    SubQueue = obj.subqueue,
                    SentAt = obj.sentAt,
                    Data = obj.data,
                    Bookmark = bookmark
                });
                _logger.DebugFormat("Marking output message {0} as InFlight", msgId);
                if (maxNumberOfMessage < messages.Count)
                    break;
                if (maxSizeOfMessagesInTotal < messages.Sum(x => x.Data.Length))
                    break;
            }
            return messages;
        }
        public void MoveToHistory(MessageBookmark bookmark)
        {
            _messages.MoveTo(bookmark);
            var id = _messages.GetMessageId();

            _messageHistory.Insert(() =>
            {
                _messages.ColumnNames.Each(x =>
                {
                    var columnBytes = _messages.ForColumnType<BytesColumn>().Get(x);
                    _messageHistory.ForColumnType<BytesColumn>().Set(x, columnBytes);
                });
                _messageHistory.ForColumnType<DateTimeColumn>().Set("moved_to_history_at", DateTime.Now);
            });
            _messages.Delete();
            _logger.Debug("Moving message {0} on queue {1} to history",
                               id, _queueName);
        }
Example #22
0
        public void RemoveReversalsMoveCompletedMessagesAndFinishSubQueueMove(Guid transactionId)
        {
            var enumerator = txs.GetEnumerator(new GuidIndex(transactionId, "by_tx_id"));
            while(enumerator.MoveNext())
            {
                var queue = txs.ForColumnType<StringColumn>().Get("queue");

                var actions = GetQueue(queue);

                var bookmark = new MessageBookmark
                {
                    Bookmark = txs.ForColumnType<BytesColumn>().Get("bookmark_data"),
                    QueueName = queue,
                    Size = txs.ForColumnType<IntColumn>().Get("bookmark_size")
                };

                switch (actions.GetMessageStatus(bookmark))
                {
                    case MessageStatus.SubqueueChanged:
                    case MessageStatus.EnqueueWait:
                        actions.SetMessageStatus(bookmark, MessageStatus.ReadyToDeliver);
                        break;
                    default:
                        if (configuration.EnableProcessedMessageHistory)
                            actions.MoveToHistory(bookmark);
                        else
                            actions.Delete(bookmark);
                        break;
                }

                txs.Delete();
            }
        }
Example #23
0
 public void SetMessageStatus(MessageBookmark bookmark, MessageStatus status, string subQueue = null)
 {
     var path = bookmark.Bookmark;
     var id = FileUtil.ToMessageId(path);
     if (!File.Exists(path))
         return;
     bookmark.Bookmark = FileUtil.MoveExtension(path, status.ToString());
     if (subQueue == null)
         _logger.DebugFormat("Changing message {0} status to {1} on {2}", id, status, _queueName);
     else
         _logger.DebugFormat("Changing message {0} status to {1} on queue '{2}' and set subqueue to '{3}'", id, status, _queueName, subQueue);
 }
Example #24
0
 public void DeleteMessageToSendHistoric(MessageBookmark bookmark)
 {
     outgoingHistory.MoveTo(bookmark);
     outgoingHistory.Delete();
 }
Example #25
0
 public Guid RegisterToSend(string destination, string queue, string subQueue, MessagePayload payload, Guid transactionId)
 {
     if (!Directory.Exists(_outgoingPath))
         Directory.CreateDirectory(_outgoingPath);
     var msgId = GuidCombGenerator.Generate();
     var obj = new Outgoing
     {
         msgId = msgId,
         txId = transactionId,
         address = destination,
         timeToSend = DateTime.Now,
         sentAt = DateTime.Now,
         queue = queue,
         subqueue = subQueue,
         headers = payload.Headers.ToQueryString(),
         data = payload.Data,
         numberOfRetries = 1,
         sizeOfData = payload.Data.Length,
         deliverBy = payload.DeliverBy,
         maxAttempts = payload.MaxAttempts,
     };
     var path = Path.Combine(_outgoingPath, FileUtil.FromTransactionId(transactionId, OutgoingMessageStatus.NotReady.ToString()));
     File.WriteAllText(path, JsonConvert.SerializeObject(obj));
     var bookmark = new MessageBookmark { Bookmark = path };
     _outgoingBookmark = bookmark;
     _logger.DebugFormat("Created output message '{0}' for 'file://{1}/{2}/{3}' as NotReady", msgId, destination, queue, subQueue);
     return msgId;
 }
 public MessageStatus GetMessageStatus(MessageBookmark bookmark)
 {
     _messages.MoveTo(bookmark);
     return (MessageStatus)_messages.ForColumnType<IntColumn>().Get("status");
 }
Example #27
0
 public void RegisterUpdateToReverse(Guid txId, MessageBookmark bookmark, MessageStatus statusToRestore, string subQueue)
 {
     if (!Directory.Exists(_txsPath))
         Directory.CreateDirectory(_txsPath);
     var path = Path.Combine(_txsPath, FileUtil.FromTransactionId(txId, null));
     if (File.Exists(path))
         File.Delete(path);
     var obj = new Tx
     {
         txId = txId,
         bookmark = bookmark.Bookmark,
         valueToRestore = (int)statusToRestore,
         queue = bookmark.QueueName,
         subQueue = subQueue,
     };
     File.WriteAllText(path, JsonConvert.SerializeObject(obj));
 }
 public void SetMessageStatus(MessageBookmark bookmark, MessageStatus status, string subqueue)
 {
     _messages.MoveTo(bookmark);
     var id = _messages.GetMessageId();
     _messages.Update(() =>
     {
         _messages.ForColumnType<IntColumn>().Set("status", (int)status);
         _messages.ForColumnType<StringColumn>().Set("subqueue", subqueue);
     });
     _logger.Debug("Changing message {0} status to {1} on queue '{2}' and set subqueue to '{3}'",
                        id, status, _queueName, subqueue);
 }
Example #29
0
 public void RemoveReversalsMoveCompletedMessagesAndFinishSubQueueMove(Guid transactionId)
 {
     if (!Directory.Exists(_txsPath))
         return;
     foreach (var path in Directory.EnumerateFiles(_txsPath, FileUtil.SearchTransactionId(transactionId, null)))
     {
         var obj = JsonConvert.DeserializeObject<Tx>(File.ReadAllText(path));
         var actions = GetQueue(obj.queue);
         var bookmark = new MessageBookmark { Bookmark = obj.bookmark, QueueName = obj.queue };
         switch (actions.GetMessageStatus(bookmark))
         {
             case MessageStatus.SubqueueChanged:
             case MessageStatus.EnqueueWait:
                 actions.SetMessageStatus(bookmark, MessageStatus.ReadyToDeliver);
                 break;
             default:
                 if (_configuration.EnableProcessedMessageHistory)
                     actions.MoveToHistory(bookmark);
                 else
                     actions.Delete(bookmark);
                 break;
         }
         File.Delete(path);
     }
 }
 public void Delete(MessageBookmark bookmark)
 {
     _messages.MoveTo(bookmark);
     _messages.Delete();
 }
Example #31
0
 public void ReverseAllFrom(Guid transactionId)
 {
     if (!Directory.Exists(_txsPath))
         return;
     foreach (var x in Directory.EnumerateFiles(_txsPath, FileUtil.SearchTransactionId(transactionId, null)))
     {
         var obj = JsonConvert.DeserializeObject<Tx>(File.ReadAllText(x));
         var oldStatus = (MessageStatus)obj.valueToRestore;
         var subqueue = obj.subQueue;
         var actions = GetQueue(obj.queue);
         var bookmark = new MessageBookmark { Bookmark = obj.bookmark, QueueName = obj.queue };
         switch (actions.GetMessageStatus(bookmark))
         {
             case MessageStatus.SubqueueChanged:
                 actions.SetMessageStatus(bookmark, MessageStatus.ReadyToDeliver, subqueue);
                 break;
             case MessageStatus.EnqueueWait:
                 actions.Delete(bookmark);
                 break;
             default:
                 actions.SetMessageStatus(bookmark, oldStatus);
                 break;
         }
     }
 }
Example #32
0
 public void DeleteMessageToSendHistoric(MessageBookmark bookmark)
 {
     if (bookmark.Bookmark.StartsWith(_outgoingHistoryPath))
         File.Delete(bookmark.Bookmark);
 }
Example #33
0
 public void MoveToHistory(MessageBookmark bookmark)
 {
     var path = bookmark.Bookmark;
     var id = FileUtil.ToMessageId(path);
     if (!File.Exists(path))
         return;
     bookmark.Bookmark = FileUtil.MoveBase(path, _msgsPath, _msgsHistoryPath, null);
     FileUtil.SetLastWriteTime(bookmark.Bookmark, DateTime.Now);
     _logger.DebugFormat("Moving message {0} on queue {1} to history", id, _queueName);
 }