Перемещение сообщения об ошибке из очереди ошибок обратно в исходную очередь с помощью Rebus - PullRequest
2 голосов
/ 23 мая 2019

Можно ли переместить сообщение об ошибке из очереди ошибок в исходную очередь, программно или через пользовательский интерфейс?

Обновление

Ниже приведены вопросы по коду:

1 Применяется ли приведенный ниже код к Издателю или Подписчику или к обоим?

Код ниже:

 Configure.With(activator)
    .Transport(t => (...)) //< use queue "error" here
    .Routing(r =>
    {
        r.AddTransportMessageForwarder(async transportMessage =>
        {
            var sourceQueue = transportMessage.Headers.TryGetValue(Headers.SourceQueue, out var result)
                ? result
                : throw new ArgumentException($"Could not find '{Headers.SourceQueue}' header");

            return ForwardAction.ForwardTo(sourceQueue);
        });
    })
    .Start();

2 Transport метод, приведенный ниже, работает для моего кода.Тем не менее, приведенный выше код предлагает использовать error имя очереди, это будет работать?

Где указано имя очереди Publiser и Subscriber, как указано ниже, если используется вышеуказанный код?

Пожалуйста, предоставьте код для шаблона sub pub.

Издатель:

.Transport(t => t.UseAzureServiceBus(Consts.ServiceBusConnectionString, Consts.Publisher))

Подписчик:

.Transport(t=>t.UseAzureServiceBus(Consts.ServiceBusConnectionString, Consts.Subscriber1))

https://github.com/rebus-org/Rebus/wiki/Transport-message-forwarding

1 Ответ

0 голосов
/ 23 мая 2019

Поскольку Rebus использует обычные очереди в качестве очередей недоставленных букв, довольно просто запустить экземпляр шины с error в качестве входной очереди - тогда вы можете, например, используйте встроенную в функцию пересылки транспортных сообщений от Rebus, чтобы сделать то, что вы хотите, для сообщений - например, переслать их в исходные очереди:

Configure.With(activator)
    .Transport(t => (...)) //< use queue "error" here
    .Routing(r =>
    {
        r.AddTransportMessageForwarder(async transportMessage =>
        {
            var sourceQueue = transportMessage.Headers.TryGetValue(Headers.SourceQueue, out var result)
                ? result
                : throw new ArgumentException($"Could not find '{Headers.SourceQueue}' header");

            return ForwardAction.ForwardTo(sourceQueue);
        });
    })
    .Start();

или что вы там хотите.

Существует также пользовательский интерфейс Fleet Manager , который может это сделать - он полностью заменяет необходимость в очередях недоставленных писем, так как хранит сообщения о сбое в своей базе данных и позволяет возвращать сбойные сообщения. сообщения в их исходные очереди (или другую очередь, если вы этого хотите), но они доступны только, если вы являетесь Rebus Pro подписчиком.


Обновление (с ответами на вопросы в вашем обновлении):

1) AddTransportMessageForwarder имеет отношение только к конечной точке, которая получает сообщения.

2) Это «имя очереди», указанное в качестве аргумента метода .Useblablabla. Например, для служебной шины Azure это будет выглядеть как

.Transport(t => t.UseAzureServiceBus(Consts.ServiceBusConnectionString, "error"))
...