簡體   English   中英

無法從 Spring Boot 應用程序連接到 IBM MQ

[英]Unable to connect to IBM MQ from a Spring Boot application

我正在嘗試從我的 Spring Boot 應用程序連接到集中托管的 IBM MQ。 這是我正在嘗試的配置:

應用程序.yml

spring:
  application:
    name: test-app

server:
  port: 8088

ibm:
  mq:
    channel: xxx.SVRCONN
    queue-manager: QM.xxx
    conn-name: xxx.xx.xxx(1414)
    user: user
    password: password

test:
  mq:
    queue-name: XXX.QUEUE

Bean 配置

@Configuration
@EnableJms
public class JMSConfig {

    @Value("${ibm.mq.conn-name}")
    private String host;

    @Bean
    public MQQueueConnectionFactory mqQueueConnectionFactory() {
        MQQueueConnectionFactory mqQueueConnectionFactory = new MQQueueConnectionFactory();
        mqQueueConnectionFactory.setHostName(host);
        try {
            String keystoreKey = "xxx";
            KeyStore keyStore = KeyStore.getInstance("JKS");
            keyStore.load(Thread.currentThread().getContextClassLoader().getResourceAsStream("mq-client.jks"),
                    keystoreKey.toCharArray());

            // Create key manager
            KeyManagerFactory keyManagerFactory = KeyManagerFactory.getInstance("SunX509");
            keyManagerFactory.init(keyStore, keystoreKey.toCharArray());
            KeyManager[] km = keyManagerFactory.getKeyManagers();

            // Create trust manager
            TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance("SunX509");
            trustManagerFactory.init(keyStore);
            TrustManager[] tm = trustManagerFactory.getTrustManagers();

            // Initialize SSLContext
            SSLContext sslContext = SSLContext.getInstance("TLSv1");
            sslContext.init(km, tm, null);
            SSLSocketFactory sslSocketFactory = sslContext.getSocketFactory();

            mqQueueConnectionFactory.setPort(1414);
            mqQueueConnectionFactory.setChannel(channel);
            mqQueueConnectionFactory.setTransportType(WMQConstants.WMQ_CM_CLIENT);
            mqQueueConnectionFactory.setObjectProperty(WMQConstants.WMQ_SSL_SOCKET_FACTORY, sslSocketFactory);
            // mqQueueConnectionFactory.setSSLCipherSuite("TLS_RSA_WITH_AES_256_CBC_SHA256");
            mqQueueConnectionFactory.setIntProperty(CommonConstants.WMQ_CONNECTION_MODE, CommonConstants.WMQ_CM_CLIENT);
            mqQueueConnectionFactory.setTransportType(CommonConstants.WMQ_CM_BINDINGS);


            MQEnvironment.sslSocketFactory = sslSocketFactory;
            MQEnvironment.sslCipherSuite = "TLS_RSA_WITH_AES_256_CBC_SHA256";

        } catch (Exception e) {
            e.printStackTrace();
        }
        return mqQueueConnectionFactory;
}

問題:在這個配置中,如果添加了這一行:

mqQueueConnectionFactory.setSSLCipherSuite("TLS_RSA_WITH_AES_256_CBC_SHA256");

然后我得到這個例外:

Could not refresh JMS Connection for destination 'RCAEC.RCA.CPO.1.QUEUE' - retrying using FixedBackOff{interval=5000, currentAttempts=1, maxAttempts=unlimited}. Cause: JMSFMQ6312: An exception occurred in the Java(tm) MQI.; nested exception is com.ibm.mq.MQException: MQJE001: Completion Code '2', Reason '2396'.

如果添加了這一行(刪除前面提到的那一行):

MQEnvironment.sslCipherSuite = "TLS_RSA_WITH_AES_256_CBC_SHA256";

然后我總是得到這個例外:

Could not refresh JMS Connection for destination 'xxxx.QUEUE' - retrying using FixedBackOff{interval=5000, currentAttempts=2, maxAttempts=unlimited}. Cause: JMSFMQ6312: An exception occurred in the Java(tm) MQI.; nested exception is com.ibm.mq.jmqi.JmqiException: CC=2;RC=2495;AMQ8568: The native JNI library 'mqjbnd64' was not found. For a client installation this is expected. [3=mqjbnd64]

我也嘗試設置-Djava.library.path="C:/Program Files/IBM/WebSphere MQ/java/lib64" ,但沒有運氣。

我在這里錯過了什么嗎?

您的第一個錯誤顯示2396 (MQRC_SSL_NOT_ALLOWED)的 MQ 原因代碼。 IBM 知識中心對此的解釋是:

已請求連接到隊列管理器,並指定了 TLS 加密。 但是,請求的連接模式是一種不支持 TLS 的連接模式(例如,綁定連接)。

查看您的代碼,當您設置了客戶端(又名網絡)連接所需的許多屬性時,您以以下行結束:-

mqQueueConnectionFactory.setTransportType(CommonConstants.WMQ_CM_BINDINGS);

這意味着您使用的是本地綁定(又名內存)類型的連接,而不是客戶端連接。 這意味着您的許多其他設置將被忽略。 刪除該行以允許以下較早的行生效,並查看您的進展情況。

mqQueueConnectionFactory.setTransportType(CommonConstants.WMQ_CM_CLIENT);

有關此特定 JMS 對象屬性的更多詳細信息,請參閱IBM 知識中心:TRANSPORT

請注意,一旦您切換到使用客戶端連接而不是本地綁定連接,您將遇到各種其他障礙,例如客戶端安全設置無疑會拒絕您最初的連接權限! 關於如何解決這些問題,這里有很多問題。 當您遇到 MQ 2035 原因代碼時,請記住檢查您的隊列管理器錯誤日志。

關於缺失的mqjbnd64 ,與其重復信息,請參閱此答案(包括評論)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM