延迟消息并指定队列

时间:2018-01-08 15:57:02

标签: rebus

我一直在玩Rebus和RabbitMQ,遇到了一个我似乎无法工作的场景。

我有几个队列; queue1& queue2并且它们采用相同的类/消息类型。现在,Rebus似乎更喜欢每个队列不同的消息类型,这对我来说不是一个选项,所以我使用高级路由bus.Advanced.Routing.Send("queue1", Message)

我想使用bus.defer功能,但我不确定如何将它们两者结合起来。我知道我可能需要引入一个waiting队列作为外部超时管理器(我还没有工作,但那是另一天)

有没有人做过类似的事情?

1 个答案:

答案 0 :(得分:0)

如何发送消息

正如您可能已经发现的那样,当您bus.Defer时,Rebus将使用端点映射从要延迟的消息类型中查找目标队列(类似于bus.Send / {{ 1}},因为它也有一个伴随的bus.SendLocal,它总是发送给发送者自己的输入队列。

缺少什么,类似于bus.DeferLocal,但幸运的是,模拟bus.Advanced.Routing.Send和显式路由消息的组合非常容易,但在消息上设置bus.Defer标头:

rbs2-deferred-recipient

如何配置超时管理器

你可以使用Rebus'内部超时管理器通过配置某种超时持久性 - 例如通过引入Rebus.SqlServer并使用SQL Server来存储超时,如下所示:

var headers = new Dictionary<string, string> {
    {Headers.DeferredRecipient, "destination-queue"}
};

var delay = TimeSpan.FromMinutes(5);

await bus.DeferLocal(delay, yourMessage, headers);

另一种选择是将Rebus端点安装为专用超时管理器,它只使用与上面相同的配置,然后所有其他端点执行此操作:

Configure.With(...)
    .(...)
    .Timeouts(t => t.StoreInSqlServer(...))
    .Start();

假设您的超时管理器使用Configure.With(...) .(...) .Timeouts(t => t.UseExternalTimeoutManager("timeouts")) .Start(); 队列。

与Rebus 5相关的更新

Rebus 5(目前作为Nuget.org上的预发布包提供)内置支持将消息延迟到明确指定的目标队列。

可以这样做:

timeouts

将简单地执行上面提到的步骤。