从WSO2向ActiveMQ队列发送消息时遇请求终止报错求助
问题:WSO2 API向ActiveMQ发消息后请求无法正常结束,报JMS超时及空指针错误
问题场景与代码
使用以下WSO2 API配置向ActiveMQ队列发送消息:
<resource methods="GET"> <inSequence> <log level="custom"> <property name="Bashir bhhhh" value="Service"/> </log> <call> <endpoint key="check_ep"/> </call> <log level="custom"> <property name="Bashir bhhhh" value="Service Ends"/> </log> </inSequence> </resource>
消息已成功投递到队列,但请求无法正常结束;手动在Postman终止请求时,出现以下错误日志:
ERROR {JMSSender} - Did not receive a JMS response within 30000 ms to destination : temp-queue://ID:IBM-PF3K6KLP-59783-1674314596400-1:2:1 with JMS correlation ID : ID:IBM-PF3K6KLP-59783-1674314596400-1:2:1:1:1 ERROR {Axis2Sender} - {api:finch} Unexpected error during sending message out java.lang.NullPointerException
原因分析
<call>mediator默认是同步调用模式,会强制等待后端返回响应,但ActiveMQ队列是单向消息传递,不会主动返回响应,因此WSO2会一直等待直到超时,导致请求长期挂起;手动终止请求时,未处理的等待逻辑触发空指针异常。- 你的场景是单向投递消息,不需要等待响应,同步调用模式不匹配需求。
解决方法
1. 替换<call>为<send> mediator
<send>是单向发送组件,发送完成后直接继续流程,不会等待响应。同时添加<respond>主动结束请求:
<resource methods="GET"> <inSequence> <log level="custom"> <property name="Bashir bhhhh" value="Service"/> </log> <send> <endpoint key="check_ep"/> </send> <log level="custom"> <property name="Bashir bhhhh" value="Service Ends"/> </log> <!-- 主动向客户端返回响应,结束请求 --> <respond/> </inSequence> </resource>
2. 确认JMS端点为单向配置
检查check_ep端点,确保是单向队列发送,无请求-响应相关配置。示例单向JMS端点:
<endpoint xmlns="http://ws.apache.org/ns/synapse" name="check_ep"> <address uri="jms:/YOUR_QUEUE_NAME?transport.jms.ConnectionFactoryJNDIName=QueueConnectionFactory&java.naming.factory.initial=org.apache.activemq.jndi.ActiveMQInitialContextFactory&java.naming.provider.url=tcp://localhost:61616&transport.jms.DestinationType=queue"/> </endpoint>
注意:不要配置replyTo、transport.jms.ReplyDestination等需要返回响应的参数。
3. 验证效果
重新部署修改后的API,调用后消息会正常投递到ActiveMQ队列,同时请求会立即返回响应,不会出现挂起或超时错误。
内容的提问来源于stack exchange,提问作者Wajih Haider
相关产品推荐
相关产品推荐

