Отправка сообщения JMS по поврежденной сети - PullRequest
0 голосов
/ 16 марта 2011

Я выполняю несколько простых тестов с ActiveMQ, чтобы увидеть, как он работает в нестабильной сети.Первый тест состоит в том, что производитель отправляет сообщения в удаленную очередь.Сообщение имеет тип ObjectMessage с сериализуемым содержимым внутри (список объектов).

В хорошей сети все работает правильно, но когда я запускаю те же тесты , используя netem для имитации потерь пакетов, задержки и повреждения Я получаю следующую ошибку при использовании сообщений при попытке извлечь содержимое сообщения:

2011-03-16 11: 59: 21,791 ОШИБКА [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 голосов
/ 17 марта 2011

Где твой код?

Если это исключение исходит из твоего кода, похоже, что у тебя есть ошибка.Например, получая какую-то ошибку JMS, получая сообщение, но путая обработку ошибок и пытаясь обработать результаты в любом случаеДля такого теста, как вы описали, вам нужно было бы сосредоточиться на обработке ошибок в своих клиентах.

У меня нет опыта работы с ActiveMQ, но кажется очень удивительным, что он позволил бы доставлять испорченные сообщения,Не то чтобы я хотел, чтобы реализация JMS распаковала ObjectMessage для проверки.Просто он должен доставлять побитовую неповрежденную копию того, что было отправлено.Или ошибка, если не может.

0 голосов
/ 16 марта 2011

Брокер не собирается проверять содержимое каждого сообщения, которое он обрабатывает, что было бы огромной тратой времени и значительно замедляло бы отправку сообщений.Клиент получил неверное сообщение и сгенерировал исключение JMSException, чтобы указать, что содержимое сообщения повреждено, что должно быть достаточно для правильного ответа приложения.

...