簡體   English   中英

使用 IBM MQ 客戶端的 JMS 連接池

[英]JMS connection pooling with IBM MQ Client

我們在 IBM MQ 9.x 服務器和 IBM MQ 客戶端之間使用 MQIPT 9.2。 我們還使用 Java 中的 IBM MQ 客戶端 jar 連接到隊列管理器以推送和接收工作正常的消息。 然而,連接創建需要時間,如果我們及時創建連接,每次都需要時間。

我們如何為 IBM MQ 實現 JMS 連接池?

下面描述了我們的連接:

[在此處輸入圖片說明 ][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 block\n");
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
    System.out.println("<<<<<<<<<<Test ended from finally >>>>>>>>>>>>");
}

使用上面的代碼創建連接需要時間,它為每個消息創建和關閉連接。 這是一個不好的做法,所以我創建了一個列表並在其中添加了連接,效果很好。 但是,我想改用適當的連接池。

您可以使用:

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

(對不起,當您發布 Java DSL 時的 XML,但您明白了)。 基本上,使用 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 依賴項。

暫無
暫無

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

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