WSO2 MI中无法读取ActiveMQ队列消息,求本地打印数据方法
问题描述
- 从ActiveMQ队列读取消息时,消息已在ActiveMQ中出队,但后端无法读取,需指导如何在本地机器读取/打印数据。
- 运行WSO2 MI服务器时触发如下错误:
Unknown error processing message org.apache.axiom.om.OMException: com.ctc.wstx.exc.WstxUnexpectedCharException:
Unexpected character '{' (code 123) in prolog; expected '<'
at [row,col {unknown-source}]: [1,1]
配置的代理服务代码
<proxy name="Listen_Queue" startOnLoad="true" transports="jms" xmlns="http://ws.apache.org/ns/synapse"> <target> <inSequence> <log level="full"> <property name="MSG" value="Receiving messages from Queue" /> </log> <property action="set" name="OUT_ONLY" value="true"/> <drop /> </inSequence> <faultSequence /> </target> <parameter name="transport.jms.Destination">WajihsCheck</parameter> <parameter name="redeliveryPolicy.redeliveryDelay">2000</parameter> <parameter name="transport.jms.ContentType">json</parameter> <parameter name="transport.jms.ConnectionFactory">myQueueListener</parameter> <parameter name="transport.jms.CacheLevel">consumer</parameter> </proxy>
解决方案及操作指导
1. 先修复WSO2 MI的消息解析错误
错误原因是JSON格式消息被默认当作XML解析,即便配置了transport.jms.ContentType为json,仍需额外处理:
- 检查ActiveMQ中消息的
JMSType属性是否设为json,未设置的话,WSO2 MI会默认按XML解析。 - 在代理的inSequence中强制指定消息类型,添加以下配置到log标签之后:
<property name="messageType" value="application/json" scope="axis2"/>
2. 本地读取/打印队列消息的三种方法
方法一:通过WSO2 MI日志完整输出
修改inSequence,保留消息并确保日志能打印完整内容,如需转发到后端则移除drop标签,添加send动作:
<inSequence> <log level="full"> <property name="MSG" value="Receiving messages from Queue" /> </log> <property action="set" name="OUT_ONLY" value="true"/> <!-- 强制指定消息类型为JSON --> <property name="messageType" value="application/json" scope="axis2"/> <!-- 如需转发到后端,取消下方send标签注释,替换为实际后端地址 --> <!-- <send> <endpoint> <address uri="http://你的后端服务地址"/> </endpoint> </send> --> <!-- 仅本地打印的话,移除drop标签 --> <!-- <drop /> --> </inSequence> 启动WSO2 MI后,查看`repository/logs/wso2carbon.log`即可获取完整消息内容。 ### 方法二:使用ActiveMQ自带工具 - 登录ActiveMQ控制台(默认地址`http://localhost:8161`),进入Queues页面找到`WajihsCheck`队列,点击队列名进入详情页,用**Browse**功能查看消息内容(适用于未出队的消息)。 - 或使用命令行工具执行: ```bash activemq browse --amqurl tcp://localhost:61616 WajihsCheck
直接打印队列中的消息内容。
方法三:编写简单Java客户端读取
使用ActiveMQ Java API编写程序读取并打印消息:
import org.apache.activemq.ActiveMQConnectionFactory; import javax.jms.*; public class QueueReader { public static void main(String[] args) throws JMSException { String brokerUrl = "tcp://localhost:61616"; String queueName = "WajihsCheck"; ConnectionFactory factory = new ActiveMQConnectionFactory(brokerUrl); Connection connection = factory.createConnection(); connection.start(); Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE); Destination destination = session.createQueue(queueName); MessageConsumer consumer = session.createConsumer(destination); consumer.setMessageListener(message -> { try { if (message instanceof TextMessage) { TextMessage textMessage = (TextMessage) message; System.out.println("Received message: " + textMessage.getText()); } } catch (JMSException e) { e.printStackTrace(); } }); // 保持程序运行60秒,等待接收消息 try { Thread.sleep(60000); } catch (InterruptedException e) { e.printStackTrace(); } consumer.close(); session.close(); connection.close(); } }
需引入ActiveMQ依赖:
<dependency> <groupId>org.apache.activemq</groupId> <artifactId>activemq-client</artifactId> <version>5.16.5</version> </dependency>
3. 后端接收问题排查
- 确认后端服务正常运行,且支持接收JSON格式请求。
- 测试WSO2 MI到后端的网络连通性,用telnet或curl验证后端地址可达。
- 在WSO2 MI的faultSequence中添加日志,排查转发错误:
<faultSequence> <log level="full"> <property name="ERROR" value="Error processing message" /> </log> </faultSequence>
内容的提问来源于stack exchange,提问作者Wajih Haider
相关产品推荐
相关产品推荐

