Как программно переслать сообщения, которые произошли с ошибкой с EasyNetQ? - PullRequest
0 голосов
/ 14 мая 2019

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

Isэто возможно, как?

1 Ответ

0 голосов
/ 01 июня 2019

Решение, которое я придумал:

public static class AdvancedBusExtensions
{
    public static async Task ResendErrorsAsync(this IAdvancedBus source, string errorQueueName)
    {
        var errorQueue = await source.QueueDeclareAsync(errorQueueName);
        var message = await source.GetMessageAsync(errorQueue);
        while (message != null)
        {
            var utf8Body = Encoding.UTF8.GetString(message.Body);
            var error = JsonConvert.DeserializeObject<Error>(utf8Body);
            var errorBodyBytes = Encoding.UTF8.GetBytes(error.Message);
            var exchange = await source.ExchangeDeclareAsync(error.Exchange, x =>
            {
                // This can be adjusted to fit the exchange actual configuration 
                x.AsDurable(true);
                x.AsAutoDelete(false);
                x.WithType("topic");
            });
            await source.PublishAsync(exchange, error.RoutingKey, true, error.BasicProperties, errorBodyBytes);
            message = await source.GetMessageAsync(errorQueue);
        }
    }
}
...