当队列不存在时,Rebus Send方法不会抛出异常

时间:2014-09-17 15:24:08

标签: rebus

我注意到如果队列不存在,Send(TCommand)方法不会抛出异常。我想问一下它是否需要行为?

在输出中我可以看到第一次机会异常,但我无法在Rebus代码中找到处理它的地方。

此外,我认为由于某些原因,它不会创建丢失的队列,我是对的吗? :)

如果目标队列不是事务性的,那么抛出异常会不会很好?

提前致谢

1 个答案:

答案 0 :(得分:3)

因为你说"交易"关于队列,我假设您正在使用MSMQ。

使用MSMQ,如果目标队列不存在,只有当队列是本地时才会出现异常 - 如果队列在另一台机器上,那根本就不会发生,因为消息发往其他计算机的目的地是传出队列。

事实上,您可以发送任何不存在的计算机上的队列,并且您不会收到错误 - 该消息最终将存储在传出队列中本地机器。过了一会儿,MSMQ将放弃尝试传递消息,它将被移动到死信队列,在那里它将被安全存储,直到你删除它(或使用例如Rebus Snoop将其发送到其他地方)

当我尝试使用this code重现此问题时,我得到了以下结果(正如预期的那样):

result when sending to nonexistent queue

另一件事:如果收件人队列是非事务性的,那么在发送 - 时你不会遇到任何错误,但是消息(一如既往)不会丢失! - 它是只是驻留在事务死信队列中,等待操作了解存在问题:

tx dead-letter queue

IMO检查收件人队列是否为事务性是没有意义的,因为收件人队列不属于发件人,因此不应将问题强加给发件人。