【发布时间】:2011-03-18 15:40:11
【问题描述】:
我正在使用 ActiveMQ 执行一些简单的测试,以了解它在不稳定网络上的表现。第一个测试包括将消息发送到远程队列的生产者。该消息是 ObjectMessage 类型,其中包含可序列化的内容(对象列表)。
在良好的网络下,一切正常,但是当我启动相同的测试 using netem 以模拟包裹丢失、延迟和损坏时,在尝试提取消息内容时使用消息时出现以下错误:
2011-03-16 11:59:21,791 错误 [com.my.MessageConsumer] 无法从字节构建正文。原因:java.io.StreamCorruptedException:无效句柄值:017E0007 javax.jms.JMSException:无法从字节构建正文。原因:java.io.StreamCorruptedException:无效句柄值:017E0007
因此,似乎消息在发送到远程队列时已损坏,但无论如何都已存储,只有在消费时,消费者才会看到消息已损坏。
之后我将使用本地队列和网络连接器将消息转发到远程队列,我希望它能解决问题,但令我惊讶的是生产者和生产者之间没有任何形式的验证保证正确交付的目的地(至少是校验和或类似的东西),我做错了什么还是正常行为?
我这里现在没有代码,但是超级简单,就是一个 MessageListener:
公共类 myMessageConsumer 实现 MessageListener{ public void onMessage(消息消息){ 尝试 { 如果(消息实例对象消息){ ObjectMessage myMessage = (ObjectMessage) 消息; 列表 dtoList = (List) myMessage.getObject(); } } 捕捉(异常前){ ex.printStackTrace(); } } }如果需要确切的代码,我会在假期回来时提供,但就是这样。
【问题讨论】:
-
好吧,我认为代理不应该通过解组您的消息来进行任何验证。它只是应该将消息发送到目的地(消费者),这就是它被解组的地方。
-
我的意思不是解组消息,但至少要进行一些完整性检查?