【发布时间】:2019-06-16 04:00:27
【问题描述】:
我需要有关标题主题的帮助。在这里请求您的建议。
我正在使用 Spring Boot 框架从 IBM MQ 8.0.0.9 获取消息。所附程序符合基本预期。但是,它始终使用操作系统凭证(特别是 Windows 登录凭证)连接到 IBM MQ。但我希望它使用属性文件中给出的凭证。即使我故意在属性文件中提供了错误的凭证,程序也很高兴地连接到 IBM MQ(使用 Windows 登录凭证,它也可以访问 IBM MQ)。
这是 MQ 详细信息 - MQ 版本 8.0.0.9, 质量管理版本 8.0.0.9, 康诺 - 未设置, CHLAUTH - 残疾人, QMGR CONNAUTH - 未设置, CHCKCLNT - 可选, AUTHINFO - SYS.DEFAULT.AUTHINFO.IDPWOS
您能否建议我在附加程序中做错了什么。我也尝试过注释的代码行。
@EnableJms
@Configuration
@EnableTransactionManagement
public class JmsConfig {
@Value("${ibm.mq.host}")
private String host;
@Value("${ibm.mq.port}")
private Integer port;
@Value("${ibm.mq.queueManager}")
private String queueManager;
@Value("${ibm.mq.channel}")
private String channel;
@Value("${ibm.mq.responseQueue}")
private String responseQueue;
@Value("${ibm.mq.userName}")
private String userName;
@Value("${ibm.mq.password}")
private String password;
@Value("${ibm.mq.receiveTimeout}")
private long timeout;
@Autowired(required=true)
@Qualifier(value="responseListener")
MessageListener responseListener;
@Bean (name="queueConnectionFactory")
public MQQueueConnectionFactory mqQueueConnectionFactory() {
MQQueueConnectionFactory mqQueueConnectionFactory = new MQQueueConnectionFactory();
try {
mqQueueConnectionFactory.setHostName(host);
mqQueueConnectionFactory.setTransportType(WMQConstants.WMQ_CM_CLIENT);
mqQueueConnectionFactory.setChannel(channel);
mqQueueConnectionFactory.setPort(port);
mqQueueConnectionFactory.setQueueManager(queueManager);
mqQueueConnectionFactory.setCCSID(819);
/*
mqQueueConnectionFactory.setBooleanProperty(WMQConstants.USER_AUTHENTICATION_MQCSP, true);
mqQueueConnectionFactory.setStringProperty(WMQConstants.USERID, userName);
mqQueueConnectionFactory.setStringProperty(WMQConstants.PASSWORD, password);
mqQueueConnectionFactory.setStringProperty(CMQC.USER_ID_PROPERTY, userName);
mqQueueConnectionFactory.setStringProperty(CMQC.PASSWORD_PROPERTY, password);
*/
} catch (JMSException e) {
log.error("Error occured: " + e);
}
return mqQueueConnectionFactory;
}
@Primary
@Bean (name="userCredentialsConnectionFactoryAdapter")
@DependsOn(value = { "queueConnectionFactory" })
UserCredentialsConnectionFactoryAdapter getUserCredentialsConnectionFactoryAdapter(
MQQueueConnectionFactory mqQueueConnectionFactory) {
UserCredentialsConnectionFactoryAdapter userCredentialsConnectionFactoryAdapter = new UserCredentialsConnectionFactoryAdapter();
userCredentialsConnectionFactoryAdapter.setUsername(userName);
userCredentialsConnectionFactoryAdapter.setPassword(password);
userCredentialsConnectionFactoryAdapter.setTargetConnectionFactory(mqQueueConnectionFactory);
return userCredentialsConnectionFactoryAdapter;
}
@Bean (name="simpleMessageListenerContainer")
@DependsOn(value = { "userCredentialsConnectionFactoryAdapter" })
public SimpleMessageListenerContainer queueResponseContainer(ConnectionFactory userCredentialsConnectionFactoryAdapter) {
SimpleMessageListenerContainer simpleMessageListenerContainer = new SimpleMessageListenerContainer();
simpleMessageListenerContainer.setConnectionFactory(userCredentialsConnectionFactoryAdapter);
simpleMessageListenerContainer.setConnectLazily(true);
simpleMessageListenerContainer.setDestinationName(responseQueue);
simpleMessageListenerContainer.setMessageListener(responseListener);
return simpleMessageListenerContainer;
}
@Bean
public JmsOperations jmsOperations(ConnectionFactory userCredentialsConnectionFactoryAdapter) {
JmsTemplate jmsTemplate = new JmsTemplate(userCredentialsConnectionFactoryAdapter);
jmsTemplate.setReceiveTimeout(timeout);
return jmsTemplate;
}
}
====================
@Component(value="responseListener")
public class ResponseListener implements MessageListener {
public void onMessage(Message message) {
...
}
}
===================
@Component
public class ContainerChecker {
@Autowired
SimpleMessageListenerContainer queueContainer;
@Scheduled(fixedRate = 300000)
public void reportContainerStatus() throws ServiceException{
if(!queueContainer.isActive()) {
...
} else {
...
}
}
}
【问题讨论】:
-
您还管理队列管理器吗?队列管理器上使用的是什么 MQ 版本?您是否启用了
CONNAUTH?如果 MQ 队列管理器是 v7.5 或更低版本(如果没有扩展支持,它将失去支持),开箱即用的 MQ 不知道如何验证用户,并且基于CHLAUTH之类的设置可能只接受断言的用户基于您的 MQ v8 客户端应用程序将是您的程序在其下运行的用户。对于 MQ v8 也是如此,其中QMGR CONNAUTH为空白,或者如果在AUTHINFO对象中填充了CHCKCLNT(NONE)集。 -
如果您的队列管理器配置符合上述情况之一,那么从应用程序端您可以将
WMQConstants.USER_AUTHENTICATION_MQCSP设置为FALSE或不设置默认为FALSE,这将导致IBM MQ Classes for JMS 将您在WMQConstants.USERID中指定的用户发送为断言用户,而不是您的程序在其下运行的用户。请记住,不会进行身份验证,队列管理器将忽略密码,任何知道要发送的主机/端口/通道/用户的人都可以连接。 -
如果您可以根据上述问题提供更多详细信息,那么我可以在答案中给出更具体的建议。
-
@JoshMc 首先谢谢你。我不管理 MQ,所以我需要先得到这些答案。我会回复你(即使它得到解决)。 BTW MQ 版本是 8.x
-
队列管理器是否也在 8.0?
标签: spring-boot jms ibm-mq spring-jms