我一直在玩Rebus和RabbitMQ,遇到了一个我似乎无法工作的场景。
我有几个队列; queue1
& queue2
并且它们采用相同的类/消息类型。现在,Rebus似乎更喜欢每个队列不同的消息类型,这对我来说不是一个选项,所以我使用高级路由bus.Advanced.Routing.Send("queue1", Message)
我想使用bus.defer
功能,但我不确定如何将它们两者结合起来。我知道我可能需要引入一个waiting
队列作为外部超时管理器(我还没有工作,但那是另一天)
有没有人做过类似的事情?
答案 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(目前作为Nuget.org上的预发布包提供)内置支持将消息延迟到明确指定的目标队列。
可以这样做:
timeouts
将简单地执行上面提到的步骤。