Я выполняю несколько простых тестов с 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();
}
}
}
Если нужен точный код, я добавлю его, когда вернусь из отпуска, но он был именно таким.