Spring Boot JMS 侦听器:无法刷新目标的 JMS 连接

Posted

技术标签:

【中文标题】Spring Boot JMS 侦听器:无法刷新目标的 JMS 连接【英文标题】:SpringBoot JMS Listener: Could not refresh JMS Connection for destination 【发布时间】:2018-12-19 14:22:07 【问题描述】:

我有 Spring Boot 应用程序,它通过 @JmsListener 注释从组件类中侦听 IBM MQ 队列,如下所示。 MQ 属性(主机名、通道、端口等)从 yaml 文件中设置。

 @JmsListener(destination = "<QueueName>")
 public void receiveMessage(BytesMessage msg)  
     //snippet to read msg
 

在gradle build中添加MQ依赖如下,

compile("com.ibm.mq:mq-jms-spring-boot-starter:0.0.2")   
        exclude group: 'org.springframework.boot', module: 'spring-boot-starter-logging'
    

只要我使用 Tomcat 容器在本地运行应用程序,它就可以正常工作并监听消息。但是如果我将它打包为 EAR 并部署到 Wesbphere8.5 服务器,它会抛出异常,并且侦听器不会从队列中读取消息。我确认所有运行时依赖项都打包在 EAR 中。尝试了不同版本的 MQ 依赖项,但没有成功。

2018-07-10 15:21:16,531 错误 DefaultMessageListenerContainer - 无法刷新目标“QueueName”的 JMS 连接 - 重试使用 FixedBackOffinterval=5000, currentAttempts=34, 最大尝试=无限。原因:JMSFMQ6312:发生异常 Java(tm) MQI。嵌套异常是 com.ibm.mq.jmqi.JmqiException: CC=2;RC=2195;AMQ9546:收到错误返回码。 [1=java.lang.reflect.InvocationTargetException[null],3=NativeConstructorAccessorImpl.newInstance0]

需要帮助来解决此问题。

【问题讨论】:

我想您会在队列管理器的AMQERR01.LOG 中获得有关此问题的更多信息。 您解决了这个问题吗?解决办法是什么? 【参考方案1】:

我遇到了类似的问题。发生这种情况的原因是 IBM MQ Connection 与您的 JMS 应用程序缺少配置。就我而言,我遇到了与授权相关的异常,但我为 IBM mq 设置了正确的用户凭据。当我检查 IBM mq 站点时,用户名不同,这不是我在 spring 应用程序中配置的。

#IBM MQ JMS Configuration
ibm.mq.queueManager=QUEUE_MANAGER
ibm.mq.channel=CHANNEL_NAME
ibm.mq.connName=HOST_NAME(HOST_PORT)
ibm.mq.user=USER_NAME
ibm.mq.password=PASSWORD

然后,我将以下属性添加到使用队列管理器进行身份验证时使用兼容模式。 在这里,我们覆盖了身份验证模式。 MQ V8 或 V9 的当前维护级别通常不需要这样做,但某些早期级别有时会出错,然后可以将此标志设置为“false

ibm.mq.user-authentication-m-q-c-s-p=false

详情请参考this page

【讨论】:

以上是关于Spring Boot JMS 侦听器:无法刷新目标的 JMS 连接的主要内容,如果未能解决你的问题,请参考以下文章

带有 tibco jms 监听器的 Spring Boot

如何访问@JmsListener使用的Spring Boot中的活动JMS连接/会话

Spring-boot 应用程序通过 WebSocket 在 WebPage 上显示 JMS 消息

使用 Spring 启动和停止 JMS 侦听器

为 JMS 侦听器处理 Spring Security 的首选方法是啥?

Spring整合JMS——消息监听器