Отложенные сообщения Rebus не пересылаются - PullRequest
2 голосов
/ 05 марта 2019

Я использую RabbitMq в качестве одностороннего транспорта для обмена темой

Я настраиваю тайм-ауты для использования внешнего менеджера под названием «timeout.queue» в RabbitMq (который мне пришлось создать вручную):

configurer.UseExternalTimeoutManager("timeout.queue")

Вот как отправить сообщение для отсрочки:

var timeToSchedule = TimeSpan.FromSeconds(timeToScheduleInSeconds);

var headers = new Dictionary<string, string>
{
    { Headers.DeferredRecipient, "demo.consumer" },
    { Headers.ReturnAddress, "demo.consumer" }
};

await _bus.Defer(timeToSchedule, new EntityScheduled(), headers);

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

Я тоже играл с заголовками, но не добился успеха.

"demo.consumer" - очередь, связанная с моим предполагаемым обменом темами "defer.topic"

1 Ответ

1 голос
/ 06 марта 2019

Полагаю, вы забыли важную часть своей инфраструктуры: «диспетчер времени ожидания».

С Rebus «диспетчер времени ожидания» - это обычная конечная точка Rebus, для которой настроено хранилище времени ожидания

Configure.With(...)
    .(...)
    .Timeouts(t => t.StoreIn(...))
    .(...)

например,

const string localDb = "server=.; database=rebus; trusted_connection=true";

Configure.With(...)
    .(...)
    .Timeouts(t => t.StoreInSqlServer(localDb, "RebusTimeouts"))
    .(...)

В вашем случае это будет примерно так:

const string localDb = "server=.; database=rebus; trusted_connection=true";

Configure.With(...)
    .Transport(t => t.UseRabbitMq(rabbitConn, "timeout.queue"))
    .Timeouts(t => t.StoreInSqlServer(localDb, "RebusTimeouts"))
    .(...)

Если установлен менеджер тайм-аута, держу пари, что ваши отложенные сообщения будутотправлять как следует.

...