Exemplo n.º 1
0
        private static async Task <MessageJournalReadResult> ParseResponseContent(HttpResponseMessage responseMessage)
        {
            var content = await responseMessage.Content.ReadAsStringAsync();

            var model        = JsonConvert.DeserializeObject <JournalGetResponseModel>(content);
            var start        = new VerbatimMessageJournalPosition(model.Start);
            var next         = new VerbatimMessageJournalPosition(model.Next);
            var endOfJournal = model.EndOfJournal;
            var entries      = new List <MessageJournalEntry>();

            foreach (var entryModel in model.Entries)
            {
                var category       = entryModel.Category;
                var position       = new VerbatimMessageJournalPosition(entryModel.Position);
                var timestamp      = entryModel.Timestamp;
                var headers        = new MessageHeaders(entryModel.Data.Headers);
                var messageContent = entryModel.Data.Content;
                var message        = new Message(headers, messageContent);
                var entry          = new MessageJournalEntry(category, position, timestamp, message);
                entries.Add(entry);
            }
            return(new MessageJournalReadResult(start, next, endOfJournal, entries));
        }
Exemplo n.º 2
0
        /// <inheritdoc />
        public virtual async Task <MessageJournalReadResult> Read(MessageJournalPosition start, int count, MessageJournalFilter filter = null, CancellationToken cancellationToken = default(CancellationToken))
        {
            var myFilter          = filter ?? new MessageJournalFilter();
            var next              = start;
            var journaledMessages = new List <MessageJournalEntry>();
            var endOfJournal      = true;
            var connection        = ConnectionProvider.GetConnection();

            try
            {
                var commandBuilder = CommandBuilders.NewSelectJournaledMessagesCommandBuilder();
                commandBuilder.Categories  = myFilter.Categories.Select(c => (string)c).ToList();
                commandBuilder.Topics      = myFilter.Topics.Select(t => (string)t).ToList();
                commandBuilder.From        = myFilter.From;
                commandBuilder.To          = myFilter.To;
                commandBuilder.Origination = myFilter.Origination;
                commandBuilder.Destination = myFilter.Destination;
                commandBuilder.RelatedTo   = myFilter.RelatedTo;
                commandBuilder.MessageName = myFilter.MessageName;
                commandBuilder.Start       = ((SQLMessageJournalPosition)start).Id;
                commandBuilder.Count       = count + 1;

                using (var scope = new TransactionScope(TransactionScopeOption.Suppress, TransactionScopeAsyncFlowOption.Enabled))
                {
                    using (var command = commandBuilder.BuildDbCommand(connection))
                    {
                        using (var reader = await command.ExecuteReaderAsync(cancellationToken))
                        {
                            while (await reader.ReadAsync(cancellationToken))
                            {
                                var record = commandBuilder.BuildJournaledMessageRecord(reader);
                                next = new SQLMessageJournalPosition(record.Id);
                                if (journaledMessages.Count < count)
                                {
                                    var category         = record.Category;
                                    var timestamp        = record.Timestamp;
                                    var headers          = DeserializeHeaders(record.Headers);
                                    var messageContent   = record.Content;
                                    var offset           = new SQLMessageJournalPosition(record.Id);
                                    var message          = new Message(headers, messageContent);
                                    var journaledMessage = new MessageJournalEntry(category, offset, timestamp, message);
                                    journaledMessages.Add(journaledMessage);

                                    next = new SQLMessageJournalPosition(record.Id + 1);
                                }
                                else
                                {
                                    endOfJournal = false;
                                }
                            }
                        }
                    }
                    scope.Complete();
                }
            }
            finally
            {
                ConnectionProvider.ReleaseConnection(connection);
            }

            return(new MessageJournalReadResult(start, next, endOfJournal, journaledMessages));
        }
Exemplo n.º 3
0
        private static bool MatchesFilter(MessageJournalFilter filter, MessageJournalEntry entry)
        {
            if (filter == null)
            {
                return(true);
            }

            var headers = entry.Data.Headers;

            if (!string.IsNullOrWhiteSpace(filter.MessageName))
            {
                var messageName = (string)headers.MessageName;
                if (!messageName.Contains(filter.MessageName))
                {
                    return(false);
                }
            }

            if (filter.Topics.Any())
            {
                var topic = headers.Topic;
                if (!filter.Topics.Contains(topic))
                {
                    return(false);
                }
            }

            if (filter.Categories.Any())
            {
                var category = entry.Category;
                if (!filter.Categories.Contains(category))
                {
                    return(false);
                }
            }

            var timestamp = entry.Timestamp;

            if (filter.From > timestamp)
            {
                return(false);
            }
            if (filter.To <= timestamp)
            {
                return(false);
            }

            if (filter.Origination != null)
            {
                var origination = headers.Origination;
                if (!origination.Equals(filter.Origination))
                {
                    return(false);
                }
            }

            if (filter.Destination != null)
            {
                var destination = headers.Destination;
                if (!destination.Equals(filter.Destination))
                {
                    return(false);
                }
            }

            if (filter.RelatedTo != null)
            {
                var relatedTo = headers.RelatedTo;
                if (!relatedTo.Equals(filter.RelatedTo))
                {
                    return(false);
                }
            }

            return(true);
        }
Exemplo n.º 4
0
 // This is a hacky way to avoid creating a nuget package for the
 // integration events in the Customer API
 private string GetEventName(MessageJournalEntry messageName)
 {
     return(typeof(CustomerNameChangedEvent).Namespace + '.' +
            messageName.Data.Headers.MessageName.ToString().Split('.').LastOrDefault());
 }