处理 Rebus MSMQ 队列删除

Handle Rebus MSMQ Queue deletion

我在我们的重组实现中使用 MSMQ 传输。下面是启动rebus服务的代码:

BuiltinHandlerActivator handlerActivator;
this.handlerActivator.Handle<TransportMessage>    
(this.HandleTransportMessageAsync);

 var bus = Configure.With(this.handlerActivator)
           .Transport(t => t.UseMsmq(this.SenderName))
           .Routing(r => r.TypeBased().AddEndpointMappingsFromAppConfig())
           .Start();  

我想处理 exception/errors 以防有人使用 snoop/compmgmt.msc 意外删除消息队列。

当我在消息队列中手动删除 MSMQ 消息队列时,我们收到一条错误消息

rebus worker queue was deleted - will not receive any more messages

所以,想知道在 Rebus 中是否可以处理此异常并提供回调或任何其他方式?

我注意到 Rebus.MSMQ 命名空间中有一个名为 MsmqTransport 的 class,它公开方法 AddQueueCallback 以提供类似的回调。由于我是 Rebus/MSMQ 的新手,所以我不知道如何使用它。任何支持都会有所帮助。

如果在 运行 时删除 Rebus 端点的输入队列或错误队列,则无法帮助恢复它们。

Rebus 当然可以 处理这种情况(在它的传输实现中,并且,在你的情况下——正如你已经正确理解的那样——在 MsmqTransport class) – 但我(和其他传输的贡献者)一定在某个时候认为没有必要这样做,可能是因为队列在运行时突然消失是一种非常罕见的情况。

在某种程度上,如果我的端点的输入队列被意外删除,我不希望我的端点继续工作——我想我更喜欢日志中的错误和红灯闪烁,因为那种情况将是一场相当大的灾难生产中。

我建议您不要在系统 运行 时删除队列。如果您在机器上使用 Rebus Snoop 时不小心删除了队列,您只需重新启动端点,然后一切都会恢复正常。


顺便说一句,添加了 AddQueueCallback 方法,这样就可以在自动创建的队列上自定义用户权限……我想可以对特定错误执行类似的操作,例如就像 "WHOA THERE'S NO QUEUE!!1" 场景。如果你觉得这是缺失的东西,你应该通过创建问题来建议它 here