让我们假设rebus无法向rabbitmq或其他队列发布消息,处理此异常的最佳做法是什么。 我停止了rabbitmq服务,并且rebus抛出了Aggregate异常。我可以手动在try-catch块中查出这个异常,但是在发生这种情况时是否有更好的解决方案来捕获异常?
答案 0 :(得分:0)
首先关闭:如果您在最初发送/发布消息时遇到异常(例如在处理网络请求时),那么您真的无能为力。对不起;)
您应该彻底记录 - 您可以的所有信息,然后确保设置日志记录,以便信息最终存储在文件或其他持久性日志中< / strong>即可。然后你应该有某种通知或流程来确保有人会在某个时候查看日志。
无论你做什么工作,你都应该有这种记录。
根据您的信息的重要程度,还可以设置某种重试机制(尽管您应该注意不要在重试时使用线程和太多内存)。此外,由于您的网络应用程序应该可以随时回收,您可能不应该(太多)重试。
但是,您可以做一些事情,以便最大限度地降低风险,以便在您无法发送/发布的情况下结束。
我可以建议你使用某种高可用性传输,比如MSMQ(因为它有本地传出队列),RabbitMQ(每台机器上有shovel),或Azure Service Bus或Azure存储队列如果你在Azure。
此外 - 如果您使用的是MSMQ,并且想要发布一个事件 - 我会先建议您class PingInput {
long inputTime;//required
String userInput;//required
}
,然后当您处理该消息时,{{1 }}。这是因为Rebus(带有MSMQ传输)需要在订阅存储中进行查找,以便获取给定事件的所有订阅者。 这不是RabbitMQ的问题,因为Rebus将使用Rabbit的主题来做pub / sub,并且和普通发送一样安全。
当您从Rebus消息处理程序中发送/发布时,当然没有问题,因为接收操作将被回滚,并且最终传入消息将最终出现在错误队列中。
我希望能够对情况有所了解:)