Объединение пула соединений JMS с клиентом IBM MQ

#jms #ibm-mq #spring-jms

#jms #ibm-mq #spring-jms

Вопрос:

Мы используем MQIPT 9.2 между нашим сервером IBM MQ 9.x и клиентами IBM MQ. Мы также используем IBM MQ client jar на Java для подключения к диспетчеру очередей для отправки и получения сообщений, который работает нормально. Однако создание соединения требует времени, и каждый раз это займет время, если мы создадим соединение точно вовремя.

Как мы можем реализовать объединение пулов соединений JMS для IBM MQ?

Ниже показано наше подключение:

[введите описание изображения здесь][1

Существует ли какой-либо стандартный способ, позволяющий реализовать объединение пулов соединений?

Используемый код ниже

 System.out.println("<<<<<<<<<Starting test for push messages>>>>>>>>>>");

try {

    // Create a keystore object for the truststore
    KeyStore trustStore = KeyStore.getInstance("JKS");
    char[] keyPassphrase = "*******".toCharArray();
    trustStore.load(new FileInputStream(
            "JKS File path"),
            keyPassphrase);
    TrustManagerFactory trustManagerFactory = TrustManagerFactory
            .getInstance(TrustManagerFactory.getDefaultAlgorithm());
    trustManagerFactory.init(trustStore);
    SSLContext sslContext = SSLContext.getInstance("TLS");
    sslContext.init(null, trustManagerFactory.getTrustManagers(), null);
    SSLSocketFactory sslSocketFactory = sslContext.getSocketFactory();
    System.out.println("SSL certificates loaded in message sending");
    // Create default MQ connection factory
    MQQueueConnectionFactory factory = new MQQueueConnectionFactory();
    factory.setTransportType(WMQConstants.WMQ_CM_CLIENT);
    factory.setQueueManager(QMGRNAME);
    factory.setHostName(HOSTNAME);
    factory.setChannel(CHANNEL);
    factory.setPort(1414);
    factory.setSSLFipsRequired(false);
    factory.setSSLSocketFactory(sslSocketFactory);
    factory.setClientReconnectTimeout(100);
    factory.setStringProperty(WMQConstants.USERID, user);
    factory.setStringProperty(WMQConstants.PASSWORD, password);
    factory.setBooleanProperty(WMQConstants.USER_AUTHENTICATION_MQCSP, true);

    factory.setStringProperty(WMQConstants.WMQ_SSL_CIPHER_SUITE, "cipher suite");


    mqConnection = (MQQueueConnection) factory.createQueueConnection();
    
    
    MQQueueSession session = (MQQueueSession) mqConnection.createQueueSession(false,
            Session.AUTO_ACKNOWLEDGE);
    // Start the connection
    System.out.println("Connection starting while sending message");
    mqConnection.start();
    System.out.println("Connection started while sending message");
    for (int i = 0; i <50; i  ) {
        System.out.println("Preparing message before sending");
        long uniqueNumber = System.currentTimeMillis() % 1000;
        JMSTextMessage message = (JMSTextMessage) session
                .createTextMessage("SimplePTP - msg"   uniqueNumber);
        System.out.println("message prepared while sending , text: "   message.getText());
        Destination destination = session.createQueue(destinationName);
        MQMessageProducer producer = (MQMessageProducer) session.createProducer(destination);

        // And, send the message
        producer.send(message);
        System.out.println("Sent message****************:n"   message);
    }

    /*
     * if (connection != null) { System.out.
     * println("*************connection closing after message sent********************"
     * ); connection.close(); System.out.
     * println("*************connection closed after message sent********************"
     * ); }
     */
    System.out.println("<<<<<<<<<<Test ended>>>>>>>>>>>>");
} catch (JMSException j) {
    j.printStackTrace();
} catch (Exception e) {
    e.printStackTrace();
} finally {
    System.out.println("finally block after message sent************ ");
    if (mqConnection != null) {
        try {
            mqConnection.close();
            System.out.println("connection closed after message sent in finally blockn");
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
    System.out.println("<<<<<<<<<<Test ended from finally >>>>>>>>>>>>");
}
  

При использовании приведенного выше кода создание соединения занимает много времени, и оно создает и закрывает соединение для каждого сообщения. Это плохая практика, поэтому я создал список и добавил в него соединение, которое работает хорошо. Однако вместо этого я хочу использовать надлежащий пул соединений.

Комментарии:

1. Вы запускаете свое приложение jns отдельно или на сервере приложений J2EE?

2. Можете ли вы показать свой код, связанный с JMS, в клиенте MQ?

3. добавлен соответствующий код. Мы также использовали это с Camel JMS route, но camel создает новое соединение для каждого сообщения

4. Spring имеет фабрику кэширования соединений, это то, что вы можете использовать?

Ответ №1:

Вы можете использовать:

 <bean class="org.apache.activemq.jms.pool.PooledConnectionFactory"
       id="source.pooledConnectionFactory" primary="true">
    <property name="maxConnections" value="1"/>
    <property name="idleTimeout" value="0"/>
    <property name="connectionFactory" ref="factory"/>
</bean>
  

(извините за XML, когда вы опубликовали Java DSL, но вы поняли идею). По сути, оберните свою фабрику подключений с помощью фабрики объединенных подключений ActiveMQ JMS.

В качестве альтернативы можно использовать:

     <dependency>
        <groupId>org.messaginghub</groupId>
        <artifactId>pooled-jms</artifactId>
        <version>1.1.0</version>
    </dependency>


    JmsPoolConnectionFactory pooledCF = new JmsPoolConnectionFactory();
    
    pooledCF.setConnectionFactory(connectionFactory());
    pooledCF.setMaxConnections(1);
  

org.messaginghub Проект является ответвлением кода ActiveMQ и не имеет зависимостей ActiveMQ.

Комментарии:

1. Даг, он использует IBM MQ, а не ActiveMQ. Работает ли фабрика объединенных подключений ActiveMQ JMS с фабрикой подключений IBM MQ?

2. ДА. Обратите внимание, что это ‘org.apache. вариант activemq.jms (jms). Он предназначен для объединения любой фабрики соединений JMS. Существует другой вариант, разработанный специально для фабрики подключений ActiveMQ. messaginghub Форк почти идентичен, с удалением тайм-аута соединения.

3. github для тех, кто заинтересован.

4. как я могу установить максимальный предел подключения с помощью пула jms

5. как и выше, с setMaxConnections() помощью функции. Однако обратите внимание, что код Spring JMS создаст одно соединение, а затем запустит несколько сеансов JMS для этого соединения.