Masstransit потребляет ошибку, не снимая ее с очереди ошибок - PullRequest
0 голосов
/ 01 марта 2019

Привет, я нуб, когда дело доходит до мастстранзита и RabbitMQ.Я пытаюсь реализовать потребителя сбоев, который будет просто читать из очереди ошибок, фактически не потребляя и не вынимая сообщение из очереди ошибок.

У меня настроен потребитель и неисправный потребитель.

cfg.ReceiveEndpoint(host, nameof(MassMailJobCommand), e =>
                    {
                        e.Consumer<MassMailJobCommandConsumer>(context);

                        e.Consumer<FaultConsumer<MassMailJobCommand>>(context);
                    });

А вот мой класс FaultConsumer

public class FaultConsumer<T> : IConsumer<Fault<T>>
{
    private INotificationsClient _notificationsClient;
    private NotificationsOptions _notificationsOptions;
    private ILogger _logger;

    public FaultConsumer(ILogger<T> logger,
                         IOptionsSnapshot<NotificationsOptions> notificationsOptions,
                         INotificationsClient notificationClient
                                       )
    {
        _notificationsClient = notificationClient;
        _notificationsOptions = notificationsOptions.Value;
        _logger = logger;
    }

    public async Task Consume(ConsumeContext<Fault<T>> context)
    {
        string exceptions = "";
        foreach (var ex in context.Message.Exceptions)
        {
            exceptions += $"{ex.StackTrace.ToString()};" +
                "\n=================>>>>>>>>====================>>>>>>>>==========================\n" +
                "======================        *END OF STACKTRACE*         =========================\n" +
                "===================>>>>>>>>====================>>>>>>>>==========================\n";
        }

        string message = $"Rabbit MQ Error:\n*Destination Address:* {context.DestinationAddress}\n*Original Message:* {context.Message.Message}\n*Exceptions:* {exceptions}";
        await _notificationsClient.Slack(message);
    }
}

Он отправляет его в свободный канал.Он работает отлично, за исключением того, что я не хочу, чтобы сообщения выходили из очереди ошибок.

Большое спасибо.

1 Ответ

0 голосов
/ 01 марта 2019

Неудачные сообщения всегда перемещаются в очередь _error.Это часть того, как работает транспорт.

Создание потребителя для Fault<T> является отдельной задачей и использует событие ошибки, которое публикуется MassTransit при сбое сообщения (и перемещается в вышеупомянутую очередь ошибок).

Событие сбоя и перемещение сообщения в очередь ошибок происходят как часть MassTransit.

Также, в качестве примечания, я бы предложил поместить вашего потребителя сбоя в отдельный раздел.конечная точка (например, fault-consumers), чтобы сообщения об ошибках не конкурировали с другими сообщениями, подлежащими обработке.Получать конечные точки, считанные из очереди, и отправлять сообщения в зависимости от типа, поэтому перед новыми командами может появиться множество ошибок.

...