Объект с коллекцией, содержащей Serializable, непримитивные объекты, не может быть установлен как ActiveMQ ObjectMessage - PullRequest
6 голосов
/ 02 августа 2011

Буду признателен за любую помощь в этом ...

У меня есть объект, который я пытаюсь отправить в JMS ObjectMessage, вызвав setObject.Этот объект содержит содержимое HashMap, а также некоторые другие поля.Когда карта содержит примитивные элементы, сообщение строится нормально.Аналогично, если я добавлю не примитивное сериализуемое поле в Object, оно также отправит ok.

Вот в чем проблема: Всякий раз, когда я пытаюсь добавить сериализуемый непримитивный объект в MAP, я получаю следующее MessageFormatException:

javax.jms.MessageFormatException: Only objectified primitive objects, String, 
Map and List types are allowed but was: com.abc.ObjectInList

Javadoc для ObjectMessage указывает ...

Можно использовать только сериализуемые объекты Java.

... check.И ...

Если необходимо отправить коллекцию объектов Java, можно использовать один из классов Collection, предоставленных начиная с JDK 1.2.

... двойная проверка,Хотя это ничего конкретно не говорит о сериализуемых объектах в коллекции, я предполагаю, что это будет поддерживаться.Я что-то здесь не так делаю?Нужно ли просто прикусить пулю и создать новое поле в моем объекте верхнего уровня, чтобы мне не нужно было помещать его в коллекцию?

Использование ActiveMQ 5.2.Далее следует соответствующая трассировка стека.

2011-08-01 21: 06: 05,767 ОШИБКА javax.jms.MessageFormatException: разрешены только объективированные объекты-примитивы, типы String, Map и List, но было: com.abc.engine.ejb.BasicSchedule@58f295b9 тип: класс c om.abc.engine.ejb.BasicSchedule 2011-08-01 21: 06: 05,767 ОШИБКА в org.apache.activemq.command.ActiveMQMessage.checkValidObject (ActiveMQMessage.java:468) 2011-08-01 21: 06: 05,767 ОШИБКА в org.apache.activemq.command.ActiveMQMapMessage.setObject (ActiveMQMapMessage.java:705) 2011-08-01 21: 06: 05,767 ОШИБКА в com.abc.chronicle.ejb.ChronicleMessageBean.initMessage (ChronicleMessageBean.java:149) 2011-08-01 21: 06: 05,767 ОШИБКА в com.abc.chronicle.ejb.ChronicleMessageBean.send (ChronicleMessageBean.java:126 2011-08-01 2011-01-01: 05,767 ОШИБКА в com.abc.chronicle.ejb.ChronicleMessageBean.onMessage (ChronicleMessageBean.java:77) 2011-08-01 21: 06: 05,767 ОШИБКА в sun.reflect.NativeMethodAccessorImpl.invoke0 (родной метод) 2011-08-0121: 06: 05,768 ОШИБКА в сun.reflect.: Разрешены только объективированные примитивные объекты, типы String, Ma p и List, но был: com.abc.engine.ejb.BasicSchedule@1003b2df тип: class com.abc.engine.ejb.BasicSchedule 2011-08-01 21:06:05,778 ОШИБКА javax.jms.MessageFormatException: разрешены только объективированные примитивные объекты, типы String, Map и List, но было: com.abc.engine.ejb.BasicSchedule@1003b2df тип: class c om.abc.engine.ejb.BasicSchedule 2011-08-01 21: 06: 05,778 ОШИБКА в org.apache.activemq.command.ActiveMQMessage.checkValidObject (ActiveMQMessage.java:468) 2011-08-01 21: 06: 05,778 ОШИБКА в org.apache.activemq.command.ActiveMQMapMessage.setObject (ActiveMQMapMessage.java:705) 2011-08-01 21: 06: 05,778 ОШИБКА на com.abc.chronicle.ejb.ChronicleMessageBean.initMessage (ChronicleMessageBean.java:149) 2011-08-01 21: 06: 05,778 ОШИБКА на com.abc.chronicle.ejb.ChronicleMessageBean.send (ChronicleMessageBean.java:125) 2011-08-01 21: 06: 05,778 ОШИБКА на com.abc.chronicle.ejb.ChronicleMessageBean.onMessage (ChronicleMessageBean.java:77)

1 Ответ

6 голосов
/ 02 августа 2011

Хотя я не проверял это, но, глядя на исходный код , кажется, что вы столкнулись с этим исключением, когда ActiveMQ проверяет сообщение свойства , а не тело. JavaDoc для ObjectMessage читает:

Можно использовать только сериализуемые объекты Java.

Я использовал все виды объектов Java с ActiveMQ (произвольный комплекс), и он всегда работал. Однако при установке свойств сообщения ( Message # setObjectProperty ):

Обратите внимание, что этот метод работает только для объективированных типов примитивных объектов (Integer, Double, Long ...) и String объектов.

Проверка приведенной выше базы кода ActiveMQ показывает, что вы пытаетесь использовать свойства объекта сообщения для отправки сложных объектов Java. Это нарушает концепцию свойств сообщений, которые должны быть простыми метаданными, такими как идентификаторы или имена пиров.

Также похоже, что ActiveMQ дополнительно поддерживает Map и List, но это зависит от поставщика.

...