我正在使用 MSMQ 传输byte
数组。
格式化程序是一个BinaryMessageFormatter
.
目标队列是私有队列,我使用的是直接 TCP 通信。
目标机器位于不同的 LAN 中,我通过其外部 IP 地址访问它。
有一个防火墙将传入的 TCP 通信路由到实际的目标机器(端口转发)。
所以系统的架构是这样的:
[源机器] --> [目标防火墙] --> [目标机器]
我已经使用该系统几个月了,一切都很好。
最近我们遇到了防火墙故障。
显然,这导致了数据损坏:
虽然队列是事务性的,并且根据 MSMQ,消息已成功传递到目标计算机,但消息的内容已损坏。
也就是说,从队列中读取消息的代码引发了异常:
try
{
var message = queue.Receive(readTimeout, transaction);
if (message != null)
{
data = (byte[]) message.Body; // this line raises an exception
return true;
}
}
catch (Exception e)
{
Logger.Error("error reading queue", e);
}
我不得不从队列(顶部)删除一些消息,然后系统恢复正常。
我的问题:
假设只是防火墙的故障导致了这种情况,并且知道它是一个事务队列,那么为什么认为消息已传递?
MSMQ 不是在执行某种校验和以确保事务队列上的数据完整性吗?