WSO2集成ActiveMQ队列无法查看消息内容:报错Cannot display ObjectMessage body
解决ActiveMQ控制台无法查看WSO2 StorableMessage类型ObjectMessage的问题
问题原因
WSO2 Integration Studio在使用JMS消息存储/处理器时,会将消息序列化为org.apache.synapse.message.store.impl.commons.StorableMessage类型的Java对象存入ActiveMQ队列。但ActiveMQ Broker默认没有这个类的依赖包,当控制台尝试反序列化ObjectMessage内容时,就会抛出java.lang.ClassNotFoundException错误,导致无法查看消息体。
RabbitMQ能正常查看是因为WSO2对RabbitMQ的消息存储默认采用文本格式(而非序列化对象),无需Broker端依赖特定类即可解析。
解决方案
方案1:给ActiveMQ添加WSO2依赖jar
- 从你的WSO2 Integration Studio安装目录中,找到包含
org.apache.synapse.message.store.impl.commons.StorableMessage类的jar包,通常名为synapse-message-store-commons-<版本号>.jar。- 可在Integration Studio的
runtime/wso2ei-7.2.0/lib目录下找到该jar(对应8.1.0版本的默认runtime),或通过IDE依赖管理工具定位。
- 可在Integration Studio的
- 将该jar复制到ActiveMQ安装目录的
lib文件夹中。 - 重启ActiveMQ Broker,让Broker加载新添加的类。
重启后,ActiveMQ控制台即可正常反序列化并显示消息内容。
方案2:修改WSO2配置,使用文本格式存储消息
如果不想给ActiveMQ添加WSO2依赖,可修改消息存储配置,让WSO2将消息以JSON/XML等文本格式存入队列,ActiveMQ控制台无需额外依赖就能直接查看内容。
修改消息存储的XML配置,添加消息格式化器和构建器参数:
<messageStore name="JMSMessageStore" class="org.apache.synapse.message.store.impl.jms.JmsStore"> <parameter name="java.naming.factory.initial">org.apache.activemq.jndi.ActiveMQInitialContextFactory</parameter> <parameter name="java.naming.provider.url">tcp://localhost:61616</parameter> <parameter name="store.jms.destination">MyQueue</parameter> <parameter name="store.jms.JMSSpecVersion">1.1</parameter> <!-- 指定JSON格式的消息处理类 --> <parameter name="messageFormatter">org.apache.synapse.commons.json.JsonFormatter</parameter> <parameter name="messageBuilder">org.apache.synapse.commons.json.JsonBuilder</parameter> </messageStore>
若消息为XML格式,可替换为对应处理类:
- 格式化器:
org.apache.synapse.core.axis2.Axis2MessageFormatter - 构建器:
org.apache.synapse.core.axis2.Axis2MessageBuilder
修改后重新部署WSO2集成项目,新存入队列的消息会以文本格式存储,ActiveMQ控制台可直接查看。
注意事项
- 方案1中,需确保添加的jar版本与WSO2 Integration Studio使用的Synapse版本一致,避免版本冲突。
- 方案2仅对修改配置后新产生的消息生效,之前已存入队列的序列化对象消息仍无法查看,需清理或通过方案1解决。
内容的提问来源于stack exchange,提问作者Cris
相关产品推荐
相关产品推荐

