Esempio n. 1
0
 /// <inheritdoc cref="IOutboxReader.AcknowledgeAsync(OutboxStoredMessage)" />
 public async Task AcknowledgeAsync(OutboxStoredMessage outboxMessage)
 {
     if (await RemoveMessageAsync(outboxMessage).ConfigureAwait(false))
     {
         await DbContext.SaveChangesAsync().ConfigureAwait(false);
     }
 }
Esempio n. 2
0
        private async Task ProcessMessageAsync(
            OutboxStoredMessage message,
            IOutboxReader outboxReader,
            IServiceProvider serviceProvider)
        {
            try
            {
                var endpoint = GetTargetEndpoint(message.MessageType, message.EndpointName, serviceProvider);
                await ProduceMessageAsync(message.Content, message.Headers, endpoint).ConfigureAwait(false);

                await outboxReader.AcknowledgeAsync(message).ConfigureAwait(false);
            }
            catch (Exception ex)
            {
                _logger.LogErrorWithMessageInfo(
                    IntegrationEventIds.ErrorProducingOutboxStoredMessage,
                    ex,
                    "Failed to produce the message in the outbox.",
                    new OutboundEnvelope(message.Content, message.Headers, new LoggingEndpoint(message.EndpointName)));

                await outboxReader.RetryAsync(message).ConfigureAwait(false);

                // Rethrow if message order has to be preserved, otherwise go ahead with next message in the queue
                if (_enforceMessageOrder)
                {
                    throw;
                }
            }
        }
Esempio n. 3
0
        private async Task ProcessMessageAsync(
            OutboxStoredMessage message,
            ConcurrentBag <OutboxStoredMessage> failedMessages,
            IOutboxReader outboxReader,
            IServiceProvider serviceProvider)
        {
            try
            {
                var endpoint = GetTargetEndpoint(message.MessageType, message.EndpointName, serviceProvider);

                await ProduceMessageAsync(
                    message.Content,
                    message.Headers,
                    endpoint,
                    message.ActualEndpointName ?? endpoint.Name,
                    _ =>
                {
                    Interlocked.Decrement(ref _pendingProduceOperations);
                },
                    exception =>
                {
                    failedMessages.Add(message);
                    Interlocked.Decrement(ref _pendingProduceOperations);

                    _logger.LogErrorProducingOutboxStoredMessage(
                        new OutboundEnvelope(
                            message.Content,
                            message.Headers,
                            new LoggingEndpoint(message.EndpointName)),
                        exception);
                })
                .ConfigureAwait(false);
            }
            catch (Exception ex)
            {
                failedMessages.Add(message);
                Interlocked.Decrement(ref _pendingProduceOperations);

                _logger.LogErrorProducingOutboxStoredMessage(
                    new OutboundEnvelope(
                        message.Content,
                        message.Headers,
                        new LoggingEndpoint(message.EndpointName)),
                    ex);

                await outboxReader.RetryAsync(message).ConfigureAwait(false);

                // Rethrow if message order has to be preserved, otherwise go ahead with next message in the queue
                if (_enforceMessageOrder)
                {
                    throw;
                }
            }
        }
Esempio n. 4
0
        private async Task <bool> RemoveMessageAsync(OutboxStoredMessage outboxMessage)
        {
            if (outboxMessage is not DbOutboxStoredMessage dbOutboxMessage)
            {
                throw new InvalidOperationException("A DbOutboxStoredMessage is expected.");
            }

            var entity = await DbSet.FindAsync(dbOutboxMessage.Id).ConfigureAwait(false);

            if (entity == null)
            {
                return(false);
            }

            DbSet.Remove(entity);
            return(true);
        }
Esempio n. 5
0
        /// <inheritdoc cref="IOutboxReader.AcknowledgeAsync" />
        public async Task AcknowledgeAsync(OutboxStoredMessage outboxMessage)
        {
            if (!(outboxMessage is DbOutboxStoredMessage dbOutboxMessage))
            {
                throw new InvalidOperationException("A DbOutboxStoredMessage is expected.");
            }

            var entity = await DbSet.FindAsync(dbOutboxMessage.Id).ConfigureAwait(false);

            if (entity == null)
            {
                return;
            }

            DbSet.Remove(entity);

            await DbContext.SaveChangesAsync().ConfigureAwait(false);
        }
Esempio n. 6
0
 /// <inheritdoc cref="IOutboxReader.RetryAsync(OutboxStoredMessage)" />
 public Task RetryAsync(OutboxStoredMessage outboxMessage)
 {
     // Nothing to do, the message is retried if not acknowledged
     return(Task.CompletedTask);
 }
Esempio n. 7
0
 public Task RetryAsync(OutboxStoredMessage outboxMessage) => throw new NotSupportedException();
Esempio n. 8
0
 public Task AcknowledgeAsync(OutboxStoredMessage outboxMessage) => Task.CompletedTask;