[英]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.