通过损坏的网络发送JMS消息

时间:2011-03-16 14:52:59

标签: jms activemq

我正在使用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();
        }
   }
}

如果需要确切的代码,我会在假期回来时把它放进去,但就是这样。

2 个答案:

答案 0 :(得分:0)

代理不会验证它处理的每条消息的内容,这将极大地浪费时间并显着减慢消息发送速度。客户端收到错误消息并抛出JMSException以指示消息内容已损坏,这应足以让您的应用程序正确响应。

答案 1 :(得分:0)

你的代码在哪里?

如果您的代码出现异常,那么您可能会遇到错误。例如,获取一些JMS错误接收消息但是搞乱错误处理并尝试处理结果。对于您所描述的测试,您需要非常关注客户端的错误处理。

我没有使用ActiveMQ的经验,但它似乎非常令人惊讶,它允许损坏的邮件传递。并不是说我希望JMS实现解压ObjectMessage来检查。只是它应该为发送的内容提供逐字节的无错复制。如果不能,则出错。