簡體   English   中英

與 Quarkus 中的消息隊列連接時出錯

[英]Error in connection with messaging queue in Quarkus

我正在嘗試使用/寫入 Quarkus 中的消息隊列,但無法這樣做。 我有一個示例代碼,我可以使用它連接到隊列,但它是使用基於 javax.jms 的 com.ibm.mq.allclient 庫制作的,

    <dependency>
      <groupId>com.ibm.mq</groupId>
      <artifactId>com.ibm.mq.allclient</artifactId>
      <version>9.0.4.0</version>
    </dependency>

並使用參數進行連接:主機名、端口、名稱、通道、隊列名稱。

示例代碼使用 com.ibm.mq.allclient 庫創建用於消費和寫入的連接,如下所示:

import com.ibm.mq.jms.MQQueue;
import com.ibm.mq.jms.MQQueueConnection;
import com.ibm.mq.jms.MQQueueConnectionFactory;
import com.ibm.mq.jms.MQQueueSession;

import javax.jms.Message;
import javax.jms.MessageConsumer;
import javax.jms.MessageProducer;
import javax.jms.TextMessage;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class MyClass {

    private static Logger logger = LoggerFactory.getLogger(MyClass.class);

    private MQQueueConnection connectionRq;
    private MQQueueConnection connectionRs;

    public void initConnection(){
        
        try {
            MQQueueConnectionFactory connectionFactoryRq = new MQQueueConnectionFactory();
            connectionFactoryRq.setHostName("localhost");
            connectionFactoryRq.setPort(5672);
            connectionFactoryRq.setTransportType(1);
            connectionFactoryRq.setQueueManager("QM_NAME");
            connectionFactoryRq.setChannel("CHANNEL");

            MQQueueConnectionFactory connectionFactoryRs = new MQQueueConnectionFactory();
            connectionFactoryRs.setHostName("localhost");
            connectionFactoryRs.setPort(5672);
            connectionFactoryRs.setTransportType(1);
            connectionFactoryRs.setQueueManager("QM_NAME");
            connectionFactoryRs.setChannel("CHANNEL");

            connectionRq = (MQQueueConnection) connectionFactoryRq.createQueueConnection();
            connectionRs = (MQQueueConnection) connectionFactoryRs.createQueueConnection();


        } catch (Exception e) {
            logger.info(e.getMessage());
        }
    }

    public String sendMessage(String msg, String correlativeId){
        
        String corId = null;
        MQQueueSession sessionRq = null;
        MQQueueSession sessionRs = null;
        MessageProducer producer = null;
        try {
            sessionRq = (MQQueueSession) connectionRq.createQueueSession(false, 1);
            MQQueue queueRq = (MQQueue) sessionRq.createQueue("queue:///QUEUENAME.RQ");
            queueRq.setMessageBodyStyle(1);
            queueRq.setTargetClient(1);

            sessionRs = (MQQueueSession) connectionRs.createQueueSession(false, 1);
            MQQueue queueRs = (MQQueue) sessionRs.createQueue("queue:///QUEUENAME.RS");

            producer = sessionRq.createProducer(queueRq);

            Message messageRq = sessionRq.createTextMessage(msg);
            messageRq.setJMSReplyTo(queueRs);
            messageRq.setIntProperty("JMS_IBM_Character_Set", 819);
            messageRq.setIntProperty("JMS_IBM_Encoding", 273);
            messageRq.setIntProperty("JMS_IBM_MsgType", 8);
            messageRq.setJMSMessageID(correlativeId);
            messageRq.setJMSCorrelationIDAsBytes(correlativeId.getBytes());
            messageRq.setJMSPriority(1);
            messageRq.setJMSType("Datagram");

            producer.send(messageRq);

            corId = messageRq.getJMSCorrelationID();
        } catch (Exception e) {
            logger.info(e.getMessage());
        }  finally {
            try {
                sessionRq.close();
            } catch (Exception e) {
                logger.info(e.getMessage());
            }
            try {
                sessionRs.close();
            } catch (Exception e) {
                logger.info(e.getMessage());
            }
            try {
                producer.close();
            } catch (Exception e) {
                logger.info(e.getMessage());
            }
        }
        return corId;
    }

    public String consumerMessage(String correlativeId){

        String msg = null;
        MQQueueSession sessionRs = null;
        MessageConsumer consumer = null;
        try {
            sessionRs = (MQQueueSession) connectionRs.createQueueSession(false, 1);
            MQQueue queueRs = (MQQueue) sessionRs.createQueue("queue:///QUEUENAME.RS");
            consumer = sessionRs.createConsumer(queueRs, "JMSCorrelationID='" + correlativeId + "'");
            connectionRs.start();
            Message messageRs = consumer.receive(10000L);
            msg = ((TextMessage) messageRs).getText();
        } catch (Exception e) {
            logger.info(e.getMessage());
        }  finally {
            try {
                sessionRs.close();
            } catch (Exception e) {
                logger.info(e.getMessage());
            }
            try {
                consumer.close();
            } catch (Exception e) {
                logger.info(e.getMessage());
            }
        }
        return msg;
    }

    public static void main(String[] args) {
        MyClass myClass = new MyClass();
        myClass.initConnection();
        String corId = myClass.sendMessage("Test Message Send", "UNIQUE");
        String message = myClass.consumerMessage(corId);
        logger.info("The message: " + message);
    }
}

上面的代碼工作正常,問題是庫與本機 Quarkus 編譯器不兼容。

對於與 Quarkus 中的 MQ 的連接,我正在使用庫:

    <dependency>
      <groupId>org.amqphub.quarkus</groupId>
      <artifactId>quarkus-qpid-jms</artifactId>
    </dependency>

在我指定的 application.properties 中:

quarkus.qpid-jms.url=amqp://localhost:5672

當嘗試運行示例項目時: Quarkus Qpid JMS Quickstart拋出以下錯誤:

__  ____  __  _____   ___  __ ____  ______ 
 --/ __ \/ / / / _ | / _ \/ //_/ / / / __/ 
 -/ /_/ / /_/ / __ |/ , _/ ,< / /_/ /\ \   
--\___\_\____/_/ |_/_/|_/_/|_|\____/___/   
2022-03-17 12:02:31,489 INFO  [org.acm.jms.PriceConsumer] (pool-11-thread-1) Writing MQ Client...
2022-03-17 12:02:31,486 INFO  [org.acm.jms.PriceConsumer] (pool-10-thread-1) Reading MQ Client...
2022-03-17 12:02:31,757 INFO  [io.quarkus] (Quarkus Main Thread) jms-quickstart 1.0.0-SNAPSHOT on JVM (powered by Quarkus 2.7.2.Final) started in 4.626s. Listening on: http://localhost:8080
2022-03-17 12:02:31,758 INFO  [io.quarkus] (Quarkus Main Thread) Profile dev activated. Live Coding activated.
2022-03-17 12:02:31,759 INFO  [io.quarkus] (Quarkus Main Thread) Installed features: [cdi, qpid-jms, resteasy, smallrye-context-propagation, vertx]
2022-03-17 12:02:34,068 ERROR [org.apa.qpi.jms.JmsConnection] (pool-11-thread-1) Failed to connect to remote at: amqp://localhost:5672
2022-03-17 12:02:34,068 ERROR [org.apa.qpi.jms.JmsConnection] (pool-10-thread-1) Failed to connect to remote at: amqp://localhost:5672

我知道這很可能是配置錯誤,我遺漏了一些東西,但我是 Quarkus 的新手,我已經閱讀並嘗試了很多我已經崩潰的東西。

我很感激任何形式的幫助,因為它會很棒,或者至少也歡迎文檔或其他指導我的東西。

參考文檔:

當您嘗試連接到localhost:5672時遇到連接失敗。 這意味着您沒有在該 TCP/IP 端口上偵聽任何內容。 您引用的說明有一個模板 MQSC 腳本,它設置隊列管理器所需的資源以允許 AMQP 連接。 這個腳本可以在這里找到。

此腳本中與您報告的特定問題最相關的命令可能是這些(盡管我建議您運行整個腳本):

START SERVICE(SYSTEM.AMQP.SERVICE)
START CHANNEL(SYSTEM.DEF.AMQP)

您的隊列管理器使用哪個版本的 IBM MQ?

因為在 IBM MQ v9.2.1 之前,它只支持通過 AMQP 發布/訂閱。 如果您想使用點對點拓撲(獲取/放入隊列),那么您需要隊列管理器至少為 MQ v9.2.1。 這里

第一段有藍色 label “v9.2.1”。 這意味着該功能被引入 IBM MQ 的時間。

現在您可以通過設置一個指向隊列的管理主題 object 來偽造它,然后使用 AMQP Pub/Sub 訪問該隊列,但是將您的隊列管理器升級到 MQ v9.2.1 或更高版本會簡單得多。 當前的 IBM MQ CD 版本是 v9.2.5。

注意:IBM MQ v9.2 的 LTS 版本還沒有這個特性。 它將包含在 MQ 的下一個主要版本中(即 v9.3 或任何名稱)。

暫無
暫無

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

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