2011-08-01 7 views
6

lo agradecería cualquier ayuda en este ...objeto con la colección que contiene objetos serializables, no primitivos no se puede establecer como ActiveMQ ObjectMessage

Tengo un objeto que estoy tratando de enviar un JMS ObjectMessage llamando a setObject. Este objeto contiene un contenido HashMap así como algunos otros campos. Cuando el mapa contiene elementos primitivos, el mensaje se construye bien. Del mismo modo, si agrego un campo serializable no primitivo al Objeto, también envía OK.

Aquí está el problema: Cada vez que intento agregar un objeto no serializable primitiva a la MAP me sale el siguiente MessageFormatException:

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

el Javadoc para ObjectMessage especifica ...

Sólo Se pueden usar objetos Java serializables.

... Comprobar. Y ...

Si se debe enviar una colección de objetos Java, se puede usar una de las clases de Colección proporcionadas desde JDK 1.2.

... doble control. Si bien esto no dice nada específicamente sobre los objetos serializables en una colección, supongo que asumiría que esto sería compatible. ¿Estoy haciendo algo mal aquí? ¿Acabo de morder la bala y crear un nuevo campo en mi Objeto de nivel superior para no tener que ponerlo en la Colección?

Usando ActiveMQ 5.2. Sigue un seguimiento de pila pertinente.

2011-08-01 21: 06: 05,767 ERROR javax.jms.MessageFormatException: objetos primitivos Sólo objetivadas, Cordel, mapa y una lista tipos son permitidos, pero fue: [email protected] tipo: clase c om.abc.engine.ejb.BasicSchedule 2011-08-01 21: 06: 05,767 ERROR en org.apache.activemq.command.ActiveMQMessage.checkValidObject (ActiveMQMessage.java:468) 2011-08- 01 21: 06: 05,767 ERROR en org.apache.activemq.command.ActiveMQMapMessage.setObject (ActiveMQMapMessage.java:705) 2011-08-01 21: 06: 05,767 ERROR en com.abc.chronicle.ejb.ChronicleMessageBean.initMessage (ChronicleMessageBean.java:149) 2011-08-01 21: 06: 05,767 ERROR en com.abc.chronicle.ejb.Chr onicleMessageBean.send (ChronicleMessageBean.java:125) 2011-08-01 21: 06: 05,767 ERROR en com.abc.chronicle.ejb.ChronicleMessageBean.onMessage (ChronicleMessageBean.java:77) 2011-08-01 21:06 : 05,767 ERROR en sun.reflect.NativeMethodAccessorImpl.invoke0 (Método nativo) 2011-08-01 21: 06: 05,768 ERROR en sun.reflect.NativeMethodAccessorImpl.invoke (NativeMethodAccessorImpl.java:39) 2011-08-01 21:06 : 05,777 ERROR [com.abc.chronicle.ejb.ChronicleMessageBean] Excepción de JMS que envía un mensaje a SDK.OUTGOING_NOTIFICATION: javax.jms.MessageFormatException: Solo se permiten los objetos primitivos objetivados, String, Ma p y los tipos de lista, pero fue: com.abc .engine.ejb.BasicSchedule @ 1003b2df tipo: class com.abc.engine.ejb.BasicSchedule 2011-08-01 21: 06: 05,778 ERROR javax.jms.MessageFormatException: Solo objetos primitivos objetivados, String, Map y Li st tipos están permitidos pero fue: [email protected] tipo: clase c om.abc.engine.ejb.BasicSchedule 2011-08-01 21: 06: 05,778 ERROR en org.apache.activemq .command.ActiveMQMessage.checkValidObject (ActiveMQMessage.java:468) 2011-08-01 21: 06: 05,778 ERROR en org.apache.activemq.command.ActiveMQMapMessage.setObject (ActiveMQMapMessage.java: 705) 2011-08-01 21: 06: 05,778 ERROR en com.abc.chronicle.ejb.ChronicleMessageBean.initMessage (ChronicleMessageBean.java:149) 2011-08-01 21: 06: 05,778 ERROR en com. abc.chronicle.ejb.ChronicleMessageBean.send (ChronicleMessageBean.java:125) 2011-08-01 21: 06: 05 778 ERROR en com.abc.chronicle.ejb.ChronicleMessageBean.onMessage (ChronicleMessageBean.java:77)

+0

Tengo el mismo problema también. Publiqué un programa de prueba aquí en el foro de Camel: http://camel.465427.n5.nabble.com/MessageFormatException-using-requestBody-InOut-over-activemq-JMS-td5554469.html#a5711703. Hay una solución para este error? –

Respuesta

6

Aunque no lo he comprobado, pero al mirar source code parece que ha marcado esta excepción cuando ActiveMQ valida el mensaje propiedades, no el cuerpo. El JavaDoc para ObjectMessage lee:

Sólo los objetos serializable Java pueden ser utilizados.

Utilicé todo tipo de objetos Java con ActiveMQ (complejo arbitrario) y siempre funcionó. Sin embargo cuando se establece propiedades del mensaje (Message#setObjectProperty):

Tenga en cuenta que este método sólo funciona para los tipos primitivos objetos (objetivados Integer, Double, Long ...) y String objetos.

Al inspeccionar la base de código de ActiveMQ citada anteriormente, parece que está intentando utilizar las propiedades del objeto de mensaje para enviar objetos complejos de Java. Esto abusa del concepto de propiedades del mensaje, que deberían ser metadatos simples como ids o nombres de pares.

También parece que ActiveMQ admite opcionalmente Map y List, pero esto es específico del vendedor.

+0

Hay un Message.setObjectProperty (Object) en la interfaz Message, sin embargo, estoy usando la subclase ObjectMessage y el método [setObject] (http://download.oracle.com/javaee/1.4/api/javax/jms/ ObjectMessage.html # setObject (java.io.Serializable)) – jpredham

+0

Además, todos los Objetos que estoy utilizando extienden Serializable – jpredham

+0

OK, ¿pueden agregar la pila de esta 'MessageFormatException' a su pregunta? No puedo razonar solo mirando la base de código ActiveMQ más. –

Cuestiones relacionadas