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

时间:2011-08-01 20:26:34

标签: java serialization collections jms activemq

我很感激任何帮助...

我有一个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)的错误

1 个答案:

答案 0 :(得分:6)

虽然我没有检查过,但是看看source code,当ActiveMQ验证消息属性而不是正文时,您似乎遇到了此异常。 ObjectMessage的{​​{3}}读取:

  

只能使用Serializable Java对象。

我使用ActiveMQ(任意复杂)的各种Java对象,它始终有效。但是,当您设置消息属性(JavaDoc)时:

  

请注意,此方法仅适用于客观化的原始对象类型(IntegerDoubleLong ...)和String个对象。

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

同样看起来ActiveMQ可选择支持MapList,但这是供应商特定的。