【问题标题】:Handle Rebus MSMQ Queue deletion处理 Rebus MSMQ 队列删除
【发布时间】:2017-08-15 19:25:22
【问题描述】:

我在我们的 rebus 实现中使用 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();  

我想处理异常/错误,以防有人使用 snoop/compmgmt.msc 意外删除消息队列。

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

rebus 工作队列已删除 - 不会再收到任何消息

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

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

【问题讨论】:

    标签: c# msmq rebus


    【解决方案1】:

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

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

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

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


    顺便说一句,添加了AddQueueCallback 方法,以便可以在自动创建的队列上自定义用户权限......我想可以对特定错误执行类似的操作,例如就像“哇,没有队列!!1”场景。如果您觉得这是缺少的东西,您应该通过创建问题 here

    来建议它

    【讨论】:

    • 感谢您的及时回复。只是想再次确认无法处理此异常(显示您在编辑中提到的简单消息)?还有一件事我可以在后台计时器工作者中使用 MsmqUtil.QueueExists 来验证队列是否存在,如果不显示用户友好的消息..?
    • (必须在那里添加许多笑脸才能达到 StackOverflow 的 15 个字符的最小限制......:))
    猜你喜欢
    • 2016-08-10
    • 2010-12-06
    • 2010-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-23
    • 2011-06-16
    相关资源
    最近更新 更多