IBM MQ:启动后出现连接错误,请重新连接到消息代理

问题描述 投票:0回答:1

我正在尝试在IBM MQ队列上发布消息。这是我的实现-

@Bean("jmsTemplate")
public JmsTemplate createProducer(@Qualifier("jmsConnectionFactory") ConnectionFactory cf) {
    JmsTemplate jmsTemplate = new JmsTemplate(cf);
    jmsTemplate.setDefaultDestinationName("my-queue-name");
    return jmsTemplate;
}

然后我在调度程序中调用它,以每秒产生一次消息-

@Autowired @Qualifier("jmsTemplate") JmsTemplate jmsTemplate;

@Scheduled(fixedDelayString = "1000")
public void runOnStart() {
    String message = "sample message "+String.valueOf(System.currentTimeMillis());
    jmsTemplate.convertAndSend(message);
    LOGGER.info(message);
}

一切正常。然后我关闭了互联网,这段代码开始引发错误-表示队列连接不可用。我将系统重新连接到Internet,然后它再次开始发送消息。凉!它按我想要的方式工作。

我试图使用带有javaContext实现的JMS2.0重复相同的实验。这是我的第二个实现-

@Bean("jmsContext")
public JMSContext createProducer(@Qualifier("jmsConnectionFactory") ConnectionFactory cf) {
    return cf.createContext();
}
@Bean("jmsProducer")
public JMSProducer createProducer(@Qualifier("jmsContext") JMSContext jmsContext) {
    return jmsContext.createProducer();
}

同样,与上一种方法类似,我创建了一个调度程序来发布这样的消息-

@Autowired @Qualifier("jmsContext") JMSContext jmsContext;
@Autowired @Qualifier("jmsProducer") JMSProducer jmsProducer;

@Scheduled(fixedDelayString = "1000")
public void runOnStart() {
    try {
        Destination destination = this.jmsContext.createQueue("my-queue-name"));
        String message = "sample message "+String.valueOf(System.currentTimeMillis());
        this.jmsProducer.send(destination, message);
    } catch (JMSException e) {
        LOGGER.error("Error in sending message", e.getLinkedException());
    }
}

这里,我也可以发送邮件。很好,到现在为止。我的问题来自以下部分。调度程序正在运行,我断开了系统与Internet的连接,代码抛出错误,提示没有连接。我重新连接了系统,但仍然没有将消息发送给代理(与先前的实现不同)。它不应该重新连接并发送消息吗?

我在第二实施中错过了什么?

注意:Bean @Qualifier("jmsConnectionFactory") ConnectionFactory cf对于两个实现都是相同的,就像-

public static ConnectionFactory getMQConnectionFactory (
        Map<String, String> queueDetails,
        SSLContext sslContext) throws Exception {
    MQConnectionFactory cf = new MQConnectionFactory();
    cf.setHostName(queueDetails.get("hostname"));
    cf.setPort(Integer.parseInt(queueDetails.get("port")));
    cf.setQueueManager(queueDetails.get("queueManager"));
    cf.setChannel(queueDetails.get("channel"));
    cf.setTransportType(WMQConstants.WMQ_CM_CLIENT);
    cf.setStringProperty(WMQConstants.USERID, queueDetails.get("username"));
    cf.setSSLCipherSuite(queueDetails.get("sslCipherSuite"));
    cf.setSSLSocketFactory(sslContext.getSocketFactory());
    return cf;
}

例外-

com.ibm.mq.MQException: JMSCMQ0001: IBM MQ call failed with compcode '2' ('MQCC_FAILED') reason '2009' ('MQRC_CONNECTION_BROKEN').
spring spring-boot jms ibm-mq messaging
1个回答
0
投票

如果希望底层的MQ客户端代码在失败时重新连接,则需要启用mq自动重新连接,如下所示:

cf.setClientReconnectOptions(WMQConstants.WMQ_CLIENT_RECONNECT);
cf.setClientReconnectTimeout(1800); // how long in seconds to continue to attempt reconnection before failing 
© www.soinside.com 2019 - 2024. All rights reserved.