我很感激任何帮助...
我有一个Object,我试图通过调用setObject来发送JMS ObjectMessage。此Object包含HashMap内容以及其他一些字段。当地图包含原始元素时,消息构建正常。同样,如果我向Object添加一个非原始的可序列化字段,它也会发送ok。
这就是问题:每当我尝试向MAP添加一个可序列化的非基本对象时,我得到以下MessageFormatException:
javax.jms.MessageFormatException: Only objectified primitive objects, String,
Map and List types are allowed but was: com.abc.ObjectInList
ObjectMessage的javadoc指定了......
只能使用Serializable Java对象。
...检查。而且......
如果必须发送Java对象集合,则可以使用自JDK 1.2以来提供的Collection类之一。
...仔细检查。虽然这没有具体说明集合中的Serializable对象,但我想我会认为这将得到支持。我在这里做错了吗?我只是咬紧牙关,在我的顶级对象中创建一个新字段,这样我就不必把它放在集合中吗?
使用ActiveMQ 5.2。随后是一个相关的堆栈跟踪。
2011-08-01 21:06:05,767错误javax.jms.MessageFormatException:只允许客观化的原始对象,String,Map和List类型,但是:com.abc.engine.ejb.BasicSchedule@58f295b9类型:class 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:125)的错误 2011-08-01 21:06:05,767 com.abc.chronicle.ejb.ChronicleMessageBean.onMessage(ChronicleMessageBean.java:77)的错误 2011-08-01 21:06:05,767错误在sun.reflect.NativeMethodAccessorImpl.invoke0(本地方法)2011-08-01 21:06:05,768错误在sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 2011-08-01 21:06:05,777 ERROR [com.abc.chronicle.ejb.ChronicleMessageBean] JMS异常向SDK发送消息.OUTGOING_NOTIFICATION:javax.jms.MessageFormatException:仅对象化的原始对象,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)的错误
答案 0 :(得分:6)
虽然我没有检查过,但是看看source code,当ActiveMQ验证消息属性而不是正文时,您似乎遇到了此异常。 ObjectMessage
的{{3}}读取:
只能使用Serializable Java对象。
我使用ActiveMQ(任意复杂)的各种Java对象,它始终有效。但是,当您设置消息属性(JavaDoc)时:
请注意,此方法仅适用于客观化的原始对象类型(
Integer
,Double
,Long
...)和String
个对象。
检查上面引用的ActiveMQ代码库,看起来您正在尝试使用消息对象属性来发送复杂的Java对象。这滥用了消息属性的概念,消息属性应该是简单的元数据,如id或对等名称。
同样看起来ActiveMQ可选择支持Map
和List
,但这是供应商特定的。