예제 #1
0
        private async Task <long> HandleMessageJournalEntries(long count, MessageJournalReadResult result, IBus bus, CancellationToken cancellationToken)
        {
            var entries = result.Entries;

            using (var entryEnumerator = entries.GetEnumerator())
            {
                if (!entryEnumerator.MoveNext())
                {
                    return(count);
                }

                // Handle messages [0, ..., n-2]
                var current = entryEnumerator.Current;
                count++;
                while (entryEnumerator.MoveNext())
                {
                    var next = entryEnumerator.Current;
                    if (next != null)
                    {
                        await HandleMessageJournalEntry(bus, cancellationToken, current, next.Position, count);
                    }

                    current = next;
                    count++;
                }

                // Handle message [n-1]
                await HandleMessageJournalEntry(bus, cancellationToken, current, result.Next, count);

                count++;
            }

            return(count);
        }
예제 #2
0
        private async Task <MessageJournalReadResult> ReadNext(CancellationToken cancellationToken, MessageJournalPosition current)
        {
            MessageJournalReadResult readResult = null;

            try
            {
                readResult = await _messageJournal.Read(current, _batchSize, _filter, cancellationToken);
            }
            catch (OperationCanceledException)
            {
                throw;
            }
            catch (Exception ex)
            {
                _diagnosticService.Emit(new DiagnosticEventBuilder(this, DiagnosticEventType.UnhandledException)
                {
                    Detail    = "Error reading message journal",
                    Exception = ex
                }.Build());

                if (_rethrowExceptions)
                {
                    throw;
                }
            }

            return(readResult);
        }