【MacOS】RocketMQ 搭建Java客户端

【MacOS】RocketMQ 搭建Java客户端

文章目录

一、引入RocketMQ客户端依赖

1.maven工程,在你的pom.xml中添加RocketMQ客户端依赖:

xml 复制代码
<dependencies>
    <!-- 添加RocketMQ客户端依赖 -->
    <dependency>
        <groupId>org.apache.rocketmq</groupId>
        <artifactId>rocketmq-client</artifactId>
        <version>版本跟你下载的rocketmq版本一样</version>
    </dependency>
</dependencies>

2.gradle工程添加库

groovy 复制代码
compile 'org.apache.rocketmq:rocketmq-client:你的版本号'
  • 注意
    1. 客户端和服务端版本要一致,否则会发射管一些奇怪的问题
    2. 要到控制台创建Topic队列名称

二、创建生产者和消费者

1.创建一个生产者

java 复制代码
mport com.alibaba.fastjson.JSONObject;
import org.apache.rocketmq.client.producer.DefaultMQProducer;
import org.apache.rocketmq.client.producer.SendResult;
import org.apache.rocketmq.common.message.Message;

/**
 * @author pengxiaoping
 * @date 2024年10月18日 11:27
 */
public class Producer {
    public static void main(String[] args) {
        Producer.producer();
    }

    public static void producer() {
        //创建DefaultMQProducer消息生产者对象
        DefaultMQProducer producer = new DefaultMQProducer("TestProducerGroup");
        //设置NameServer 多个节点间用分号分割
        producer.setNamesrvAddr("localhost:9876");
        try {
            //与NameServer建立长连接
            producer.start();
            //发送十条数据
            for (int i = 1; i <= 10; i++) {
                //1S中发送一次
                Thread.sleep(1000);
                JSONObject json = new JSONObject();
                json.put("orderId",i+1);
                json.put("desc","这是第"+i+1+"个订单");
                //数据正文
                String data = json.toJSONString();
                /*创建消息
                Message消息三个参数
                topic 代表消息主题,自定义自定义TopicOrder代表订单主题代表订单主题
                tags 代表标志,用于消费者接收数据时进行数据筛选。PAY_TAG代表支付相关信息
                body 代表消息内容
                */
                Message message = new Message("TopicOrder", "PAY_TAG", data.getBytes());
                //发送消息,获取发送结果
                SendResult result = producer.send(message);
                //将发送结果对象打印在控制台
                System.out.println("消息已发送:MsgId:" + result.getMsgId() + ",发送状态:"
                        + result.getSendStatus());
            }
        }catch (Exception e){
            e.printStackTrace();
        }finally {
            try {
                producer.shutdown();
            } catch (Exception e) {
            }
        }
    }

}

消费者

对于Consumer来说,他有两种基础的工作方式:pull和push。

区别:push:broker端来了消息以后主动将消息从broker端向consumer端推送。

pull:对于consumer来说主动往broker发一个请求,然后broker在通过请求响应给consumer一批消息。一般用push模式。

1.创建一个PullConsumer
java 复制代码
import org.apache.rocketmq.client.consumer.DefaultLitePullConsumer;
import org.apache.rocketmq.common.message.MessageExt;

import java.util.List;

public class PullConsumer {
    public static volatile boolean running = true;
    public static void consumer() {
        //创建pull消费者对象
        DefaultLitePullConsumer litePullConsumer = new DefaultLitePullConsumer("TestPullConsumerGroup");
        //设置NameServer节点
        litePullConsumer.setNamesrvAddr("localhost:9876");
        try {
            //订阅主题,与Push相同
            litePullConsumer.subscribe("TopicOrder", "*");
            //每次拉取数据条目数
            litePullConsumer.setPullBatchSize(10);
            //启动消费者
            litePullConsumer.start();
            while (running) {
                List<MessageExt> messageExts = litePullConsumer.poll();
                //批量数据处理
                for (MessageExt msg : messageExts) {
                    System.out.println("消费者获取数据:" + msg.getMsgId() + "==>" + new
                            String(msg.getBody()));
                }
            }
        }catch (Exception e){
            e.printStackTrace();
        }finally {
            litePullConsumer.shutdown();
        }
    }

    public static void main(String[] args) {
        PullConsumer.consumer();
    }
}
2.创建一个PushConsumer
java 复制代码
import org.apache.rocketmq.client.consumer.DefaultMQPushConsumer;
import org.apache.rocketmq.client.consumer.listener.ConsumeConcurrentlyContext;
import org.apache.rocketmq.client.consumer.listener.ConsumeConcurrentlyStatus;
import org.apache.rocketmq.client.consumer.listener.MessageListenerConcurrently;
import org.apache.rocketmq.common.message.MessageExt;

import java.util.List;

public class PushConsumer {
    public static void consumer() {
        //创建消费者对象
        DefaultMQPushConsumer consumer = new DefaultMQPushConsumer("TestConsumerGroup");
        try {
            //设置NameServer节点
            consumer.setNamesrvAddr("localhost:9876");
            /*订阅主题,
            consumer.subscribe包含两个参数:
            topic: 说明消费者从Broker订阅哪一个主题,这一项要与Provider保持一致。
            subExpression: 子表达式用于筛选tags。
            同一个主题下可以包含很多不同的tags,subExpression用于筛选符合条件的tags进行接收。
            例如:设置为*,则代表接收所有tags数据。
            例如:设置为PAY_TAG,则Broker中只有tags=PAY_TAG的消息会被接收,而其他的就会被排除在外。
            */
            consumer.subscribe("TopicOrder", "*");
            //创建监听,当有新的消息监听程序会及时捕捉并加以处理。
            consumer.registerMessageListener(new MessageListenerConcurrently() {
                public ConsumeConcurrentlyStatus consumeMessage(
                        List<MessageExt> msgs, ConsumeConcurrentlyContext context) {
                    //批量数据处理
                    for (MessageExt msg : msgs) {
                        System.out.println("消费者获取数据:" + msg.getMsgId() + "==>" + new
                                String(msg.getBody()));
                    }
                    //返回数据已接收标识
                    return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;
                }
            });
            //启动消费者,与Broker建立长连接,开始监听。
            consumer.start();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        PushConsumer.consumer();
    }
}

三、遇到的问题

1.连接失败的问题

tex 复制代码
Caused by: org.apache.rocketmq.remoting.exception.RemotingConnectException: connect to null failed
	at org.apache.rocketmq.remoting.netty.NettyRemotingClient.invokeSync(NettyRemotingClient.java:572)
	at org.apache.rocketmq.client.impl.MQClientAPIImpl.getTopicRouteInfoFromNameServer(MQClientAPIImpl.java:2050)
	at org.apache.rocketmq.client.impl.MQClientAPIImpl.getTopicRouteInfoFromNameServer(MQClientAPIImpl.java:2041)
	at org.apache.rocketmq.client.impl.factory.MQClientInstance.updateTopicRouteInfoFromNameServer(MQClientInstance.java:782)
	... 6 more
  • 检查代码中设置的NameServer地址是否正确,跟配置文件中的NAME_ADDR地址一致。确保没有拼写错误、IP 地址或域名准确,以及端口号正确。
  • 检查 RocketMQ 的 NameServer 是否已经启动并且正在运行。查看 NameServer 的日志文件,确认没有错误或异常情况。如果 NameServer 没有启动,需要启动它。确保 NameServer 的配置正确,并且没有与其他服务冲突。

2.主题没有找到

tex 复制代码
org.apache.rocketmq.client.exception.MQClientException: No route info of this topic: TopicTest
See https://rocketmq.apache.org/docs/bestPractice/06FAQ for further details.
	at org.apache.rocketmq.client.impl.producer.DefaultMQProducerImpl.sendDefaultImpl(DefaultMQProducerImpl.java:879)
	at org.apache.rocketmq.client.impl.producer.DefaultMQProducerImpl.send(DefaultMQProducerImpl.java:1564)
	at org.apache.rocketmq.client.producer.DefaultMQProducer.send(DefaultMQProducer.java:475)
	at org.apache.rocketmq.example.quickstart.Producer.main(Producer.java:78)
org.apache.rocketmq.client.exception.MQClientException: No route info of this topic: TopicTest
See https://rocketmq.apache.org/docs/bestPractice/06FAQ for further details.
	at org.apache.rocketmq.client.impl.producer.DefaultMQProducerImpl.sendDefaultImpl(DefaultMQProducerImpl.java:879)
	at org.apache.rocketmq.client.impl.producer.DefaultMQProducerImpl.send(DefaultMQProducerImpl.java:1564)
	at org.apache.rocketmq.client.producer.DefaultMQProducer.send(DefaultMQProducer.java:475)
	at org.apache.rocketmq.example.quickstart.Producer.main(Producer.java:78)
  • 主题不存在或者未被创建:

    sh 复制代码
    #在控制台创建主题 -n namesrv 的地址。-t 主题名。-c 指定所在集群
    sh bin/mqadmin updateTopic -n localhost:9876 -t TopicOrder -c DefaultCluster
    sh 复制代码
    #出现这个创建成功
    create topic to 172.16.224.140:10911 success.
    TopicConfig [topicName=TopicOrder, readQueueNums=8, writeQueueNums=8, perm=RW-, topicFilterType=SINGLE_TAG, topicSysFlag=0, order=false, attributes={}]
相关推荐
CLCNboss5 小时前
Mac安装Ruby
开发语言·经验分享·笔记·macos·ruby
昨天今天明天好多天5 小时前
【Mac】Homebrew
大数据·macos
喜大普奔⁶⁶⁶7 小时前
MacOS/Macbook用户自定义字体安装教程
macos·自定义字体
Topstip7 小时前
苹果转向 Apple Silicon,Intel Mac 的支持时限倒计时
macos
孤客网络科技工作室9 小时前
macOS开发环境配置与应用开发教程
macos
SoraLuna14 小时前
「Mac畅玩鸿蒙与硬件7」鸿蒙开发环境配置篇7 - 使用命令行工具和本地模拟器管理项目
macos·华为·harmonyos
sysin.org15 小时前
Xcode 16.1 (16B40) 发布下载 - Apple 平台 IDE
ide·macos·xcode
csdn_金手指17 小时前
mac电脑通过 npm 安装 @vue/cli脚手架超时问题;
vue.js·macos·npm
wingのpeterPen21 小时前
mac 上使用 cmake 构建包含 OpenMP 的项目
c++·macos
Rverdoser1 天前
Mac安装 TIDB并启动集群
macos·tidb