在将azureRxMessage.GetBody类型从int更改为string后,我正在编写一些测试代码,我收到错误azure "Expecting element 'string' from namespace 'http://schemas.microsoft.com/2003/10/Serialization/'.. Encountered 'Element' with name 'int', namespace 'http://schemas.microsoft.com/2003/10/Serialization/'. "}
。
当看到这个时,似乎总线正在存储所有先前发送的项目,所以期待一个字符串,但是正在读取一个int(如之前发送的那样)。第var msg = azureRxMessage.GetBody<string>();
行引发了错误。
我的问题是:
处理邮件的最佳方法是什么?将正文作为字符串(序列化为JSON)或标准数据合同发送?
如果客户端开始将消息传送到总线上的格式不正确并开始中毒总线,会发生什么?我们怎样才能防止这种情况发生?
答案 0 :(得分:3)
您可能需要能够将更改部署到消息定义中,而不会先排除队列干扰(或者将新类型的消息转发到其他队列),因此在接收方使用类似调度程序的方法是一个很好的途径。您可以将消息类型的版本号放在message metadata property上,该MaxDeliveryCount property可以指示消息的版本号,然后使用该信息来了解要将正文反序列化的对象类型。或者,您可以首先将消息的内容作为字符串拉出,并在反序列化之前使用它来确定消息的版本。或者,您可以简单地将JSON正文加载反序列化为动态对象,并让代码查看它以确定如何处理它。所有这些方法只是意味着为了生存下来,代码中的不同类型的消息将需要能够检测到哪种类型的允许主体被传递,以便它可以相应地处理。
对于问题二,Service Bus Brokered消息传递确实内置了有害消息处理。如果在队列或订阅上设置Deadletter,如果尝试多次传递消息,它将自动对消息进行处理。 。您也可以更加主动,当您看到邮件正文时,您可以直接在其上调用{{3}}。