我注意到如果队列不存在,Send(TCommand) 方法不会引发异常。我想问这是理想的行为吗?
在输出中我可以看到第一次机会异常,但我找不到在 Rebus 代码中处理它的地方。
此外,我相信它不会因为某些充分的理由而创建丢失队列,对吗?:)
如果目标队列不是事务性的,那么抛出异常不是很好吗?
提前致谢
我注意到如果队列不存在,Send(TCommand) 方法不会引发异常。我想问这是理想的行为吗?
在输出中我可以看到第一次机会异常,但我找不到在 Rebus 代码中处理它的地方。
此外,我相信它不会因为某些充分的理由而创建丢失队列,对吗?:)
如果目标队列不是事务性的,那么抛出异常不是很好吗?
提前致谢
由于您说的是关于队列的“事务性”,我假设您正在使用 MSMQ。
使用 MSMQ,如果目标队列仅在本地队列不存在时会出现异常- 如果队列在另一台机器上,那根本不可能发生,因为发往其他机器的消息放在本地传出队列中。
事实上,您可以发送到任何不存在机器上的队列,并且您不会收到任何错误 - 消息最终将存储在本地机器上的传出队列中。一段时间后,MSMQ 将放弃尝试传递消息,并将其移至死信队列,在那里安全地存储它,直到您将其删除(或将其发送到其他地方,例如使用Rebus Snoop)。
当我尝试使用此代码重现此问题时,我得到以下结果(如预期的那样):
另一件事:如果收件人队列是非事务性的,您在发送时不会遇到错误 -但消息(一如既往)不会丢失!- 它只是驻留在事务性死信队列中,等待操作了解存在问题:
IMO 检查收件人队列是否是事务性的没有意义,因为收件人队列不属于发件人,因此不应将其问题强加给发件人。