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

vgp*_*vgp 8 spring-jms websphere-8 spring-boot spring-boot-gradle-plugin ibm-mq

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

 @JmsListener(destination = "<QueueName>")
 public void receiveMessage(BytesMessage msg) { 
     //snippet to read msg
 }
Run Code Online (Sandbox Code Playgroud)

MQ 依赖项添加到 gradle 构建中,如下所示,

compile("com.ibm.mq:mq-jms-spring-boot-starter:0.0.2") {  
        exclude group: 'org.springframework.boot', module: 'spring-boot-starter-logging'
    }
Run Code Online (Sandbox Code Playgroud)

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

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

需要帮助来解决此问题。

RCv*_*ram 1

我遇到了类似的问题。发生这种情况的原因是您的 JMS 应用程序在 IBM MQ 连接上缺少配置。就我而言,我遇到了与授权相关的异常,但我为 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}
Run Code Online (Sandbox Code Playgroud)

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

ibm.mq.user-authentication-m-q-c-s-p=false
Run Code Online (Sandbox Code Playgroud)

请参阅此页面了解更多详情