包含Serializable非原始对象的集合的对象不能设置为ActiveMQ ObjectMessage

jpr*_*ham 6 java collections serialization activemq-classic jms

我很感激任何帮助...

我有一个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
Run Code Online (Sandbox Code Playgroud)

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( NativeMet hodAccessorImpl.java:39)2011-08-01 21:06:05,777错误[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 ERROR 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 ERROR 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.ab c.chronicle.ejb.ChronicleMessageBean.send(ChronicleMessageBean.java:125)2011-08-01 21:06:05,778 com.abc.chronicle.ejb.ChronicleMessageBean.onMessage(ChronicleMessageBean.java:77)的错误

Tom*_*icz 6

虽然我没有检查它,但是看看源代码,当ActiveMQ验证消息属性而不是正文时,你似乎遇到了这个异常.该JavaDoc中ObjectMessage内容如下:

只能使用Serializable Java对象.

我使用ActiveMQ(任意复杂)的各种Java对象,它总是有效.但是,当您设置消息属性(Message#setObjectProperty)时:

注意,此方法仅适用于对象化的原始对象类型(Integer,Double,Long...)和String对象.

检查上面引用的ActiveMQ代码库,看起来您正在尝试使用消息对象属性来发送复杂的Java对象.这滥用了消息属性的概念,消息属性应该是简单的元数据,如id或对等名称.

此外,它看起来像ActiveMQ的可选支持MapList,但是这是供应商特定的.