1

我注意到如果队列不存在,Send(TCommand) 方法不会引发异常。我想问这是理想的行为吗?

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

此外,我相信它不会因为某些充分的理由而创建丢失队列,对吗?:)

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

提前致谢

4

1 回答 1

3

由于您说的是关于队列的“事务性”,我假设您正在使用 MSMQ。

使用 MSMQ,如果目标队列仅在本地队列不存在时会出现异常- 如果队列在另一台机器上,那根本不可能发生,因为发往其他机器的消息放在本地传出队列中。

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

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

发送到不存在的队列时的结果

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

tx 死信队列

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

于 2014-09-18T05:00:24.823 回答