Невозможно подключиться к IBM MQ из приложения Spring Boot - PullRequest
1 голос
/ 04 марта 2020

Я пытаюсь подключиться к централизованно размещенному IBM MQ из моего приложения Spring Boot. Это конфигурация, которую я пытаюсь использовать:

application.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

Конфигурация компонента

@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", но не повезло.

Я что-то здесь упускаю?

1 Ответ

4 голосов
/ 04 марта 2020

Ваша первая ошибка показывает код причины MQ 2396 (MQRC_SSL_NOT_ALLOWED) . Это объясняется в Центре знаний IBM:

Запрошено соединение с администратором очередей с указанием шифрования TLS. Однако запрашиваемый режим подключения - это режим, который не поддерживает TLS (например, привязки подключаются).

Просматривая свой код, пока вы настроили ряд атрибутов, необходимых для клиента (он же) сетевое), вы отключаете sh следующей строкой: -

mqQueueConnectionFactory.setTransportType(CommonConstants.WMQ_CM_BINDINGS);

, что означает, что вы используете тип соединения с локальной привязкой (он-лайн), а не клиентское соединение. Это означает, что многие другие ваши настройки игнорируются. Удалите эту строку, чтобы разрешить вступление в силу следующей предыдущей строки, и посмотрите, как вы попали.

mqQueueConnectionFactory.setTransportType(CommonConstants.WMQ_CM_CLIENT);

См. Центр знаний IBM: TRANSPORT для получения дополнительной информации по этому параметру c Свойство JMS Object.

Обратите внимание, что после переключения на использование клиентского соединения вместо локального связывания вы столкнетесь со всевозможными другими препятствиями, такими как настройки безопасности клиента, которые, несомненно, откажутся Вам разрешено подключаться изначально! Здесь есть много вопросов о том, как решить эти проблемы. Не забудьте проверить свой журнал ошибок администратора очередей, когда вы нажмете код причины MQ 2035.

Что касается пропущенной mqjbnd64, а не повторяющейся информации, см. этот ответ (включая комментарии) .

...