我正在使用ActiveMQ执行一些简单的测试,以了解它在非稳定网络上的表现。第一个测试包括一个将消息发送到远程队列的生产者。消息的类型为ObjectMessage,其中包含可序列化的内容(对象列表)。
有了良好的网络,一切正常,但是当我启动相同的测试using netem来模拟软件包丢失,延迟和损坏时,在尝试提取消息内容时消费消息时会出现以下错误:
2011-03-16 11:59:21,791 ERROR [com.my.MessageConsumer]无法从字节构建正文。原因:java.io.StreamCorruptedException:句柄值无效:017E0007 javax.jms.JMSException:无法从字节构建正文。原因:java.io.StreamCorruptedException:句柄值无效:017E0007
因此,在发送到远程队列时,似乎邮件已损坏,但无论如何都存储了,只有在消费时消费者才会看到邮件已损坏。
在此之后,我将使用本地队列和网络连接器将消息转发到远程队列,我希望它能解决问题,但我很惊讶生产者和生产者之间没有任何形式的验证。目的地(至少是一个校验和或类似的东西),保证正确的交付,我做错了什么或是正常行为?
我现在没有这里的代码,但它非常简单,只是一个MessageListener:
public class myMessageConsumer implements MessageListener{ public void onMessage(Message message){ try { if (message instanceof ObjectMessage){ ObjectMessage myMessage = (ObjectMessage) message; List dtoList = (List) myMessage.getObject(); } } catch(Exception ex){ ex.printStackTrace(); } } }
如果需要确切的代码,我会在假期回来时把它放进去,但就是这样。
答案 0 :(得分:0)
代理不会验证它处理的每条消息的内容,这将极大地浪费时间并显着减慢消息发送速度。客户端收到错误消息并抛出JMSException以指示消息内容已损坏,这应足以让您的应用程序正确响应。
答案 1 :(得分:0)
你的代码在哪里?
如果您的代码出现异常,那么您可能会遇到错误。例如,获取一些JMS错误接收消息但是搞乱错误处理并尝试处理结果。对于您所描述的测试,您需要非常关注客户端的错误处理。
我没有使用ActiveMQ的经验,但它似乎非常令人惊讶,它允许损坏的邮件传递。并不是说我希望JMS实现解压ObjectMessage来检查。只是它应该为发送的内容提供逐字节的无错复制。如果不能,则出错。