我在我们的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的新手,我无法弄清楚如何使用它。任何支持都会有所帮助。
答案 0 :(得分:1)
如果在运行时删除Rebus端点的输入队列或错误队列,则无法帮助它们恢复。
Rebus 当然可以处理这种情况(在其传输实现中,在您的情况下 - 正如您在MsmqTransport
类中已经正确找到的那样) - 但我(和其他传输的贡献者)必须在某种程度上认为没有必要这样做,可能是因为队列在运行时突然消失将是一种非常罕见的情况。
在某种程度上,如果输入队列被意外删除,我不希望我的端点继续工作 - 我想我更喜欢日志中的ERROR和红灯闪烁,因为这种情况在生产中会是一场相当大的灾难
我建议您在系统运行时不要删除队列。如果您在计算机上乱搞Rebus Snoop时意外删除了一个队列,您只需重启端点,然后一切都将恢复正常。
btw添加了AddQueueCallback
方法,以便可以在自动创建的队列上自定义用户权限...我想可以针对特定错误执行类似的操作,例如:喜欢“WHOA那里没有QUEUE !! 1”的场景。如果您认为这是遗漏的内容,则应通过创建问题here