You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用新版本Vert.x实现含QManager与Channel的MQ Series队列消息收发

用新版Vert.x实现IBM MQ队列消息收发(含QManager与Channel配置)

你之前的代码误用了Vert.x的标准MQTT客户端,而QManager、Channel是IBM MQ(MQ Series)原生协议的专属配置项,标准MQTT协议并不包含这些参数,因此新版Vert.x MQTT客户端移除了相关API。正确的做法是使用Vertx官方提供的vertx-ibm-mq客户端来对接IBM MQ原生队列。

步骤1:引入依赖

先在项目中添加vertx-ibm-mq的依赖(版本需与你的Vert.x核心版本保持一致):

Maven

<dependency>
  <groupId>io.vertx</groupId>
  <artifactId>vertx-ibm-mq</artifactId>
  <version>4.5.1</version>
</dependency>

Gradle

implementation 'io.vertx:vertx-ibm-mq:4.5.1'

步骤2:配置连接参数

创建IBM MQ连接配置,直接设置QManager、Channel等核心参数:

IBMMQConnectionOptions connectionOptions = new IBMMQConnectionOptions()
  .setHost("localhost")
  .setPort(1414) // IBM MQ原生协议默认端口
  .setQueueManager("my-qmanager")
  .setChannel("my-channel")
  .setUsername("my-client-id")
  .setPassword("my-password");

步骤3:实现消息收发完整示例

import io.vertx.core.Vertx;
import io.vertx.ibm.client.IBMMQClient;
import io.vertx.ibm.client.IBMMQConnectionOptions;
import io.vertx.ibm.client.IBMMQMessage;
import io.vertx.ibm.client.IBMMQProducer;
import io.vertx.ibm.client.IBMMQConsumer;

public class IBMMQVertxExample {
  public static void main(String[] args) {
    Vertx vertx = Vertx.vertx();

    // 创建IBM MQ客户端实例
    IBMMQClient client = IBMMQClient.create(vertx);

    // 连接到IBM MQ
    client.connect(connectionOptions, connectResult -> {
      if (connectResult.succeeded()) {
        System.out.println("成功连接到IBM MQ");

        // --------------------------
        // 监听输入队列 "entrada"
        // --------------------------
        IBMMQConsumer consumer = client.createConsumer("entrada");
        consumer.handler(message -> {
          System.out.println("收到消息: " + message.bodyAsString());
          // 手动确认消息(保证可靠性)
          message.acknowledge();
        });
        consumer.exceptionHandler(err -> 
          System.err.println("消费者异常: " + err.getMessage())
        );

        // --------------------------
        // 发送消息到输出队列 "salida"
        // --------------------------
        IBMMQProducer producer = client.createProducer("salida");
        IBMMQMessage sendMsg = new IBMMQMessage()
          .setBody("Hola Mundo".getBytes());

        producer.send(sendMsg, sendResult -> {
          if (sendResult.succeeded()) {
            System.out.println("消息发送成功");
          } else {
            System.err.println("消息发送失败: " + sendResult.cause().getMessage());
          }
        });
        producer.exceptionHandler(err -> 
          System.err.println("生产者异常: " + err.getMessage())
        );

      } else {
        System.err.println("连接IBM MQ失败: " + connectResult.cause().getMessage());
      }
    });

    // 应用退出时关闭连接
    Runtime.getRuntime().addShutdownHook(new Thread(() -> {
      client.close(closeResult -> {
        if (closeResult.succeeded()) {
          System.out.println("IBM MQ连接已关闭");
        }
      });
      vertx.close();
    }));
  }
}

关键注意事项

  • 端口区分:IBM MQ原生协议默认端口是1414,不要和MQTT的1883端口混淆。
  • 队列权限:确保你的账号对目标队列拥有PUT(发送)和GET(接收)权限。
  • 版本兼容:vertx-ibm-mq版本必须与Vert.x核心版本一致,避免兼容性问题。
  • 消息确认:如果需要保证消息不丢失,务必调用message.acknowledge()完成消息确认。

内容的提问来源于stack exchange,提问作者Victor Marrerp

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 22:13:14