mq-jms-spring-boot-starter 的 JNDI 连接问题

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

我正在使用 mq-jms-spring-boot-starter

        <dependency>
            <groupId>com.ibm.mq</groupId>
            <artifactId>mq-jms-spring-boot-starter</artifactId>
            <version>3.0.6</version>
        </dependency>

我正在努力与远程 IBM MQ Server 建立 JNDI 连接

这是我的服务

@Slf4j
@Service
public class JMSService {

    static final String MESSAGE_FORMAT_MQSTR = "MQSTR";


    private String destinationPromoJndiName = "jms/promoQueue";


    @Autowired
    private JmsTemplate jmsTemplate;


    /**
     * Sending a packet via MQSeries to the Promo queue
     */
    public void sendPromoPacket(final byte[] paquet) throws TechnicalException {
        try {
            log.info("send message to  '{}", this.destinationPromoJndiName);
            jmsTemplate.convertAndSend(this.destinationPromoJndiName, paquet);
        } catch (JmsException e) {
            e.printStackTrace();
            throw new TechnicalException("error sending promo packet ..");
        }
    }
}

我收到以下错误

2024-04-16T08:31:02.815Z  INFO 1 --- [tpmc1000] [nio-8080-exec-4] c.package.fr.tpmc.storage.JMSService   : send message to  'jms/PromoQueue
org.springframework.jms.IllegalStateException: JMSWMQ0018: Failed to connect to queue manager 'QM1' with connection mode 'Client' and host name 'Client'.; nested exception is com.ibm.mq.MQException: JMSCMQ0001: IBM MQ call failed with compcode '2' ('MQCC_FAILED') reason '2538' ('MQRC_HOST_NOT_AVAILABLE').
    at org.springframework.jms.support.JmsUtils.convertJmsAccessException(JmsUtils.java:274)
    at org.springframework.jms.support.JmsAccessor.convertJmsAccessException(JmsAccessor.java:199)
    at org.springframework.jms.core.JmsTemplate.execute(JmsTemplate.java:533)
    at org.springframework.jms.core.JmsTemplate.send(JmsTemplate.java:610)
    ...
Caused by: com.ibm.msg.client.jakarta.jms.DetailedIllegalStateException: JMSWMQ0018: Failed to connect to queue manager 'QM1' with connection mode 'Client' and host name 'Client'.
Check the queue manager is started and if running in client mode, check there is a listener running. Please see the linked exception for more information.
    at com.ibm.msg.client.jakarta.wmq.common.internal.Reason.reasonToException(Reason.java:489)
    at com.ibm.msg.client.jakarta.wmq.common.internal.Reason.createException(Reason.java:215)
    at com.ibm.msg.client.jakarta.wmq.internal.WMQConnection.<init>(WMQConnection.java:458)
    at com.ibm.msg.client.jakarta.wmq.factories.WMQConnectionFactory.createV7ProviderConnection(WMQConnectionFactory.java:8683)
    at com.ibm.msg.client.jakarta.wmq.factories.WMQConnectionFactory.createProviderConnection(WMQConnectionFactory.java:8023)
    at com.ibm.msg.client.jakarta.jms.admin.JmsConnectionFactoryImpl._createConnection(JmsConnectionFactoryImpl.java:322)
    at com.ibm.msg.client.jakarta.jms.admin.JmsConnectionFactoryImpl.createConnection(JmsConnectionFactoryImpl.java:242)
    at com.ibm.mq.jakarta.jms.MQConnectionFactory.createCommonConnection(MQConnectionFactory.java:6026)
    at com.ibm.mq.jakarta.jms.MQConnectionFactory.createConnection(MQConnectionFactory.java:6055)
    at org.springframework.jms.connection.SingleConnectionFactory.doCreateConnection(SingleConnectionFactory.java:452)
    at org.springframework.jms.connection.SingleConnectionFactory.initConnection(SingleConnectionFactory.java:414)
    at org.springframework.jms.connection.SingleConnectionFactory.getConnection(SingleConnectionFactory.java:328)
    at org.springframework.jms.connection.SingleConnectionFactory.createConnection(SingleConnectionFactory.java:243)
    at org.springframework.jms.support.JmsAccessor.createConnection(JmsAccessor.java:211)
    at org.springframework.jms.core.JmsTemplate.execute(JmsTemplate.java:517)
    ... 135 more
Caused by: com.ibm.mq.MQException: JMSCMQ0001: IBM MQ call failed with compcode '2' ('MQCC_FAILED') reason '2538' ('MQRC_HOST_NOT_AVAILABLE').
    at com.ibm.msg.client.jakarta.wmq.common.internal.Reason.createException(Reason.java:203)
    ... 148 more
Caused by: com.ibm.mq.jmqi.JmqiException: CC=2;RC=2538;AMQ9204: Connection to host 'localhost(1414)' rejected. [1=com.ibm.mq.jmqi.JmqiException[CC=2;RC=2538;AMQ9204: Connection to host 'localhost/127.0.0.1:1414' rejected. [1=java.net.ConnectException[Connection refused],3=localhost/127.0.0.1:1414,4=TCP,5=Socket.connect]],3=localhost(1414),4=,5=RemoteTCPConnection.bindAndConnectSocket]
    at com.ibm.mq.jmqi.remote.api.RemoteFAP$Connector.jmqiConnect(RemoteFAP.java:13670)
    at com.ibm.mq.jmqi.remote.api.RemoteFAP$Connector.access$100(RemoteFAP.java:13202)
    at com.ibm.mq.jmqi.remote.api.RemoteFAP.jmqiConnect(RemoteFAP.java:1451)
    at com.ibm.mq.jmqi.remote.api.RemoteFAP.jmqiConnect(RemoteFAP.java:1392)
    at com.ibm.mq.ese.jmqi.InterceptedJmqiImpl.jmqiConnect(InterceptedJmqiImpl.java:377)
    at com.ibm.mq.ese.jmqi.ESEJMQI.jmqiConnect(ESEJMQI.java:562)
    at com.ibm.msg.client.jakarta.wmq.internal.WMQConnection.<init>(WMQConnection.java:391)
    ... 147 more
Caused by: com.ibm.mq.jmqi.JmqiException: CC=2;RC=2538;AMQ9204: Connection to host 'localhost/127.0.0.1:1414' rejected. [1=java.net.ConnectException[Connection refused],3=localhost/127.0.0.1:1414,4=TCP,5=Socket.connect]
    at com.ibm.mq.jmqi.remote.impl.RemoteTCPConnection.bindAndConnectSocket(RemoteTCPConnection.java:932)
    at com.ibm.mq.jmqi.remote.impl.RemoteTCPConnection.protocolConnect(RemoteTCPConnection.java:1511)
    at com.ibm.mq.jmqi.remote.impl.RemoteConnection.connect(RemoteConnection.java:1013)
    at com.ibm.mq.jmqi.remote.impl.RemoteConnectionSpecification.getNewConnection(RemoteConnectionSpecification.java:691)
    at com.ibm.mq.jmqi.remote.impl.RemoteConnectionSpecification.getSessionFromNewConnection(RemoteConnectionSpecification.java:283)
    at com.ibm.mq.jmqi.remote.impl.RemoteConnectionSpecification.getSession(RemoteConnectionSpecification.java:170)
    at com.ibm.mq.jmqi.remote.impl.RemoteConnectionPool.getSession(RemoteConnectionPool.java:128)
    at com.ibm.mq.jmqi.remote.api.RemoteFAP$Connector.jmqiConnect(RemoteFAP.java:13402)
    ... 153 more
Caused by: java.net.ConnectException: Connection refused
    at java.base/sun.nio.ch.Net.connect0(Native Method)
    at java.base/sun.nio.ch.Net.connect(Net.java:589)
    at java.base/sun.nio.ch.Net.connect(Net.java:578)
    at java.base/sun.nio.ch.NioSocketImpl.connect(NioSocketImpl.java:583)
    at java.base/java.net.SocksSocketImpl.connect(SocksSocketImpl.java:327)
    at java.base/java.net.Socket.connect(Socket.java:751)
    at java.base/java.net.Socket.connect(Socket.java:686)
    at com.ibm.mq.jmqi.remote.impl.RemoteTCPConnection$4.run(RemoteTCPConnection.java:1111)
    at com.ibm.mq.jmqi.remote.impl.RemoteTCPConnection$4.run(RemoteTCPConnection.java:1103)
    at java.base/java.security.AccessController.doPrivileged(AccessController.java:319)
    at com.ibm.mq.jmqi.remote.impl.RemoteTCPConnection.connectSocket(RemoteTCPConnection.java:1103)
    at com.ibm.mq.jmqi.remote.impl.RemoteTCPConnection.bindAndConnectSocket(RemoteTCPConnection.java:838)
    ... 160 more
2024-04-16T08:31:03.590Z ERROR 1 --- [tpmc1000] [nio-8080-exec-4] o.a.c.c.C.[.[.[/].[dispatcherServlet]    : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed: com.package.fr.tpmc.exception.TechnicalException: error sending promo packet ..] with root cause

如何使用 JMS 正确配置 IBM MQ?这里是我应该使用的所有提供的属性

      // connection factory ..
      jndi-queue-factory: jms/prologQF

      hostName: x.x.x.x
      port: 1423
      prologQF_channel: QMX0.SVRC.APPPROMO
      prologQF_queueManager: QMX0
      queueProxy_targetClient: MQJMS_CLIENT_NONJMS_MQ
      queueProxy_ccsid: 819
      promoQueue_baseQueueName: APP.PROMO

请问有关如何配置 springboot 启动器的任何帮助吗?

更新

我添加了以下 JmsConfig


@Configuration
public class JmsConfig {

    @Bean
    public MQQueueConnectionFactory mqConnectionFactory(JmsProperties jmsProperties) throws JMSException {
        MQQueueConnectionFactory mqQueueConnectionFactory = new MQQueueConnectionFactory();
        mqQueueConnectionFactory.setHostName("x.x.x.x");
        mqQueueConnectionFactory.setChannel("QMX0.SVRC.APPPROMO");
        mqQueueConnectionFactory.setPort(1423);
        mqQueueConnectionFactory.setQueueManager("QMX0");
        mqQueueConnectionFactory.setTransportType(WMQConstants.WMQ_CLIENT_NONJMS_MQ);
        return mqQueueConnectionFactory;
    }

    @Bean
    public JmsTemplate jmsTemplate(MQQueueConnectionFactory mqConnectionFactory) {
        JmsTemplate jmsTemplate = new JmsTemplate();
        jmsTemplate.setConnectionFactory(mqConnectionFactory);
        return jmsTemplate;
    }
}

我在应用程序引导时没有收到任何错误,但在尝试向 ibm 队列发送消息时收到以下错误消息

2024-04-16T10:31:20.862Z  INFO 1 --- [tpmc1000] [nio-8080-exec-1] c.package.fr.app.storage.JMSService   : send message to  'jms/queuePromo
org.springframework.jms.InvalidDestinationException: JMSWMQ2008: Failed to open MQ queue 'jms/queuePrologPromo'.; nested exception is com.ibm.mq.MQException: JMSCMQ0001: IBM MQ call failed with compcode '2' ('MQCC_FAILED') reason '2085' ('MQRC_UNKNOWN_OBJECT_NAME').
    at org.springframework.jms.support.JmsUtils.convertJmsAccessException(JmsUtils.java:280)
    at org.springframework.jms.support.JmsAccessor.convertJmsAccessException(JmsAccessor.java:199)
    at org.springframework.jms.core.JmsTemplate.execute(JmsTemplate.java:533)
    at org.springframework.jms.core.JmsTemplate.send(JmsTemplate.java:610)
    ...
Caused by: com.ibm.msg.client.jakarta.jms.DetailedInvalidDestinationException: JMSWMQ2008: Failed to open MQ queue 'jms/queuePrologPromo'.
JMS attempted to perform an MQOPEN, but IBM MQ reported an error.
Use the linked exception to determine the cause of this error. Check that the specified queue and queue manager are defined correctly.
    at com.ibm.msg.client.jakarta.wmq.common.internal.Reason.reasonToException(Reason.java:513)
    at com.ibm.msg.client.jakarta.wmq.common.internal.Reason.createException(Reason.java:215)
    at com.ibm.msg.client.jakarta.wmq.internal.WMQMessageProducer.checkJmqiCallSuccess(WMQMessageProducer.java:1358)
    at com.ibm.msg.client.jakarta.wmq.internal.WMQMessageProducer.checkJmqiCallSuccess(WMQMessageProducer.java:1313)
    at com.ibm.msg.client.jakarta.wmq.internal.WMQMessageProducer.access$800(WMQMessageProducer.java:75)
    at com.ibm.msg.client.jakarta.wmq.internal.WMQMessageProducer$SpiIdentifiedProducerShadow.initialise(WMQMessageProducer.java:900)
    at com.ibm.msg.client.jakarta.wmq.internal.WMQMessageProducer.<init>(WMQMessageProducer.java:1288)
    at com.ibm.msg.client.jakarta.wmq.internal.WMQSession.createProducer(WMQSession.java:1128)
    at com.ibm.msg.client.jakarta.jms.internal.JmsSessionImpl.createProducer(JmsSessionImpl.java:1484)
    at com.ibm.msg.client.jakarta.jms.internal.JmsQueueSessionImpl.createSender(JmsQueueSessionImpl.java:121)
    at com.ibm.mq.jakarta.jms.MQQueueSession.createSender(MQQueueSession.java:143)
    at com.ibm.mq.jakarta.jms.MQQueueSession.createProducer(MQQueueSession.java:248)
    at org.springframework.jms.core.JmsTemplate.doCreateProducer(JmsTemplate.java:1141)
    at org.springframework.jms.core.JmsTemplate.createProducer(JmsTemplate.java:1122)
    at org.springframework.jms.core.JmsTemplate.doSend(JmsTemplate.java:628)
    at org.springframework.jms.core.JmsTemplate.lambda$send$3(JmsTemplate.java:612)
    at org.springframework.jms.core.JmsTemplate.execute(JmsTemplate.java:530)
    ... 135 more
Caused by: com.ibm.mq.MQException: JMSCMQ0001: IBM MQ call failed with compcode '2' ('MQCC_FAILED') reason '2085' ('MQRC_UNKNOWN_OBJECT_NAME').
    at com.ibm.msg.client.jakarta.wmq.common.internal.Reason.createException(Reason.java:203)
    ... 150 more
2024-04-16T10:31:22.085Z ERROR 1 --- [tpmc1000] [nio-8080-exec-1] o.a.c.c.C.[.[.[/].[dispatcherServlet]    : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed: com.package.fr.tpmc.exception.TechnicalException: error sending promo packet ..] with root cause

com.package.fr.tpmc.exception.TechnicalException: error sending promo packet ..

...

我无法注册连接工厂

java:/jms/queueProlog

spring-boot ibm-mq jndi spring-jms
1个回答
0
投票

错误信息

org.springframework.jms.InvalidDestinationException: JMSWMQ2008: Failed to open MQ queue 'jms/queuePrologPromo'

表明 spring 无法将 JNDI 名称解析为队列名称。

您的

application.properties

中应该有以下设置
ibm.mq.jndi.providerUrl=...
  ibm.mq.jndi.providerContextFactory=com.sun.jndi.fscontext.RefFSContextFactory

基于 JNDI 的 mq-jms-spring-boot-starter 文档

如果失败,您可以通过

application.properties
例如提供主机和端口。


ibm.mq.queueManager=QM1  
ibm.mq.channel=DEV.APP.SVRCONN
ibm.mq.connName=server.example.com(1414)
ibm.mq.user=user1
ibm.mq.password=passw0rd

如 mq-jms-spring-boot-starter 的 repo 中所述

如果失败,您可以将队列名称添加到

application.properties
中。使用您选择的任何键。例如。

app.queue.name=DEV.QUEUE.1

然后将其注入到您的代码中。例如。


    @Value("${app.queue.name}")
    public String sendQueue;

© www.soinside.com 2019 - 2024. All rights reserved.