集合中包含可序列化、非原始对象的对象不能设置为 ActiveMQ ObjectMessage

问题描述 投票:0回答:1

如果有任何帮助,我将不胜感激...

我有一个对象,我试图通过调用 setObject 在 JMS ObjectMessage 中发送。该对象包含 HashMap 内容以及一些其他字段。当地图包含原始元素时,消息就构建得很好。同样,如果我向对象添加一个非原始可序列化字段,它也会发送正常。

这就是问题所在:每当我尝试将可序列化的非原始对象添加到 MAP 时,我都会收到以下 MessageFormatException:

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

ObjectMessage 的 javadoc 指定...

只能使用可序列化的Java对象。

...检查。还有...

如果必须发送 Java 对象集合,可以使用 JDK 1.2 以来提供的 Collection 类之一。

...仔细检查。虽然这并没有具体说明集合中可序列化对象的任何内容,但我想我会假设这会受到支持。我在这里做错了什么吗?我是否只是硬着头皮在顶级对象中创建一个新字段,这样我就不必将其放入集合中?

使用ActiveMQ 5.2。下面是相关的堆栈跟踪。

2011-08-01 21:06:05,767 ERROR     javax.jms.MessageFormatException: Only objectified primitive objects, String, Map and List types are allowed but was: com.abc.engine.ejb.BasicSchedule@58f295b9 type: class com.abc.engine.ejb.BasicSchedule
2011-08-01 21:06:05,767 ERROR          at org.apache.activemq.command.ActiveMQMessage.checkValidObject(ActiveMQMessage.java:468)
2011-08-01 21:06:05,767 ERROR          at org.apache.activemq.command.ActiveMQMapMessage.setObject(ActiveMQMapMessage.java:705)
2011-08-01 21:06:05,767 ERROR          at com.abc.chronicle.ejb.ChronicleMessageBean.initMessage(ChronicleMessageBean.java:149)
2011-08-01 21:06:05,767 ERROR          at com.abc.chronicle.ejb.ChronicleMessageBean.send(ChronicleMessageBean.java:125)
2011-08-01 21:06:05,767 ERROR          at com.abc.chronicle.ejb.ChronicleMessageBean.onMessage(ChronicleMessageBean.java:77)
2011-08-01 21:06:05,767 ERROR          at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)2011-08-01 21:06:05,768 ERROR          at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
2011-08-01 21:06:05,777 ERROR [com.abc.chronicle.ejb.ChronicleMessageBean]   JMS Exception Sending Message to SDK.OUTGOING_NOTIFICATION : javax.jms.MessageFormatException: Only objectified primitive objects, String, Map and List types are allowed but was: com.abc.engine.ejb.BasicSchedule@1003b2df type: class com.abc.engine.ejb.BasicSchedule
2011-08-01 21:06:05,778 ERROR     javax.jms.MessageFormatException: Only objectified primitive objects, String, Map and List types are allowed but was: com.abc.engine.ejb.BasicSchedule@1003b2df type: class com.abc.engine.ejb.BasicSchedule
2011-08-01 21:06:05,778 ERROR          at org.apache.activemq.command.ActiveMQMessage.checkValidObject(ActiveMQMessage.java:468)
2011-08-01 21:06:05,778 ERROR          at org.apache.activemq.command.ActiveMQMapMessage.setObject(ActiveMQMapMessage.java:705)
2011-08-01 21:06:05,778 ERROR          at com.abc.chronicle.ejb.ChronicleMessageBean.initMessage(ChronicleMessageBean.java:149)
2011-08-01 21:06:05,778 ERROR          at com.abc.chronicle.ejb.ChronicleMessageBean.send(ChronicleMessageBean.java:125)
2011-08-01 21:06:05,778 ERROR          at com.abc.chronicle.ejb.ChronicleMessageBean.onMessage(ChronicleMessageBean.java:77)
java serialization collections jms activemq
1个回答
6
投票

虽然我还没有检查过,但是查看源代码,当ActiveMQ验证消息属性而不是正文时,你似乎遇到了这个异常。 ObjectMessage

JavaDoc
内容为:

只能使用可序列化的Java对象。

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

请注意,此方法仅适用于对象化的原始对象类型(

Integer
Double
Long
...)和
String
对象。

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

而且看起来 ActiveMQ 可以选择支持

Map
List
,但这是特定于供应商的。

© www.soinside.com 2019 - 2024. All rights reserved.