我有一个非常奇怪的问题-有时(约占所有消息的8%)我们的微服务从IBM MQ发送和接收消息,但没有从队列中接收消息,但是此消息存在于队列中,服务只是等待50秒(这是我们的超时时间),仅此而已。日志中没有异常...
主要问题不是问题的原因,而是有关IBM MQ客户端(com.ibm.mq.allclient版本9.1.1.0)为何不引发异常的这一问题?
更新更多细节:我们有客户端尝试在50秒内从队列中获取消息。下面的代码非常简单:
private fun receiveMessage(messageId: String, route: SoapGatewayProperties.TimbRouteProperties): String {
val routeId = route.id
val responseQueue = route.client.responseQueue
val response = jmsTemplates[routeId]?.receiveSelectedAndConvert(responseQueue, "JMSCorrelationID='$messageId'")
return response?.let {
RequestContext.getCurrentContext().responseStatusCode = 200
it.toString()
} ?: throw ZuulRuntimeException(ZuulException("Forwarding error", 500, "No response message has been received for : "
+ "routeId=" + routeId
+ "; messageId=" + messageId
+ "; responseQueue=" + responseQueue))
}
不幸的是,我没有直接访问队列的权限,但是我可以获取一些日志文件,并且可以看到消息在回复队列中出现了8-9秒。看起来一切都很好,但是我不知道为什么ibm客户端不能在50秒内从队列中提取消息。我增加了超时时间,看到这些暂停的jsm客户端请求在57-61秒内从回复队列中提取了消息。对我来说,不清楚两件事:1)延迟的原因是什么2)为什么ibm jms客户端的实现不会抛出任何异常而只转发null之类的响应。
关于com.ibm.mq.allclient的版本:我使用的版本:9.1.0、9.1.1、9.1.5
例如,这是您忘记初始化所需消息的经典问题吗?
获取消息...返回消息99
找不到消息99 ...,因为您已经对其进行了处理。
确保在获取消息时清除/ use_new结构