我正在编写一个带有监听器的 Java 应用程序,用于从 WebSphere MQ 读取消息。
这是我的 applicationContext.xml:
<bean id="transactionManager"
class="org.springframework.jms.connection.JmsTransactionManager">
<property name="connectionFactory" ref="mqQueueConnectionFactory" />
</bean>
<bean id="mqMessageListener" class="ru.mos.notification.controller.MQNotificationListener">
<property name="mqwsUrl" value="${mqws.url}" />
<property name="mqwsSoapAction" value="${mqws.soapAction}" />
<property name="mqwsSoapStart" value="${mqws.soapStart}" />
<property name="mqwsSoapEnd" value="${mqws.soapEnd}" />
</bean>
<bean id="mqQueueConnectionFactory" class="com.ibm.mq.jms.MQQueueConnectionFactory">
<property name="hostName" value="${mq.hostName}" />
<property name="port" value="${mq.port}" />
<property name="queueManager" value="${mq.queueManager}" />
<property name="transportType" value="1" />
<property name="channel" value="${mq.channel}" />
</bean>
<bean id="jmsConnectionFactory"
class="org.springframework.jms.connection.UserCredentialsConnectionFactoryAdapter">
<property name="targetConnectionFactory" ref="mqQueueConnectionFactory" />
<property name="username" value="${mq.username}" />
<property name="password" value="${mq.password}" />
</bean>
<bean
class="org.springframework.jms.listener.DefaultMessageListenerContainer">
<property name="destinationName" value="${mq.destinationName}" />
<property name="destinationResolver">
<bean
class="org.springframework.jms.support.destination.DynamicDestinationResolver" />
</property>
<property name="sessionAcknowledgeModeName" value="AUTO_ACKNOWLEDGE" />
<property name="sessionTransacted" value="true" />
<property name="messageListener" ref="mqMessageListener" />
<property name="transactionManager" ref="transactionManager"/>
<property name="connectionFactory" ref="jmsConnectionFactory" />
</bean>
这就是导致问题的原因:
<property name="transactionManager" ref="transactionManager"/>
如果我删除此属性,一切都会正常工作。我的队列中的消息已被读取。但如果我放置此属性,则会出现以下错误:
17:54:20,468 WARN DefaultMessageListenerContainer:821 - Setup of JMS message listener invoker failed for destination 'asurtst1qu' - trying to recover. Cause: Could not create JMS transaction; nested exception is com.ibm.msg.client.jms.DetailedJMSSecurityException: JMSWMQ2013: The security authentication was not valid that was supplied for QueueManager 'asurtst1mgr' with connection mode 'Client' and host name '172.31.197.247(1414)'. Please check if the supplied username and password are correct on the QueueManager you are connecting.
如果出现任何错误,我需要事务管理器将消息放回队列。但由于这个异常,我无法使用它。请帮助我。
最佳答案
您的 transactionManager bean 应该引用 jmsConnectionFactory 而不是 mqQueueConnectionFactory。
关于java - Spring应用到MQ认证问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27106762/