RocketMQ入坑指南(四):消费者的使用方式

前言

在这里先祝福大家新年快乐!因为假期原因,距离上一篇的生产者教程已经过了很久,今天是上班的第一天,我们继续分享RocketMQ的第四篇教程,主要介绍消费者相关的知识。

一、消费者概述

消费者组:一个逻辑概念,在使用消费者时需要指定一个组名。一个消费者组可以订阅多个Topic。

消费者实例:一个消费者组程序部署了多个进程,每个进程都可以称为一个消费者实例。

订阅关系:一个消费者组订阅一个Topic的某一个 Tag,这种记录被称为订阅关系。

实际使用中,要保证消费订阅关系一致,一个消费者组中的订阅Topic和Tag必须一致。

二、集群消费模式和广播消费模式

1.集群消费模式

在同一个消费组中,消费者是负载均衡的消费Topic中的消息。

设置消费模式为集群模式

consumer.setMessageModel(MessageModel.CLUSTERING);

生产者:

每一秒生产一条数据


        //创建DefaultMQProducer消息生产者对象
        DefaultMQProducer producer = new DefaultMQProducer("TestProducerGroup");
        //设置NameServer
        producer.setNamesrvAddr("192.168.2.5:9876");
        //设置NameServer节点地址,多个节点间用分号分割
        try {
            //与NameServer建立长连接
            producer.start();
            //发送一百条数据
            for (int i = 1; i <= 10; i++) {
                //1S中发送一次
                Thread.sleep(1000);
                JSONObject json = new JSONObject();
                json.put("orderId", i);
                json.put("desc", "这是第" + i + "个订单");
                //数据正文
                String data = json.toJSONString();
                Message message = new Message("TopicOrder", "", 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) {
            }
        }

启动两个消费者


        //创建消费者对象
        DefaultMQPushConsumer consumer = new DefaultMQPushConsumer("TestPushConsumerGroup");
        try {
            //设置NameServer节点
            consumer.setNamesrvAddr("192.168.2.5:9876");
            //订阅主题
            consumer.subscribe("TopicOrder", "*");
            //设置消费模式为集群模式
            consumer.setMessageModel(MessageModel.CLUSTERING);
            //创建监听,当有新的消息监听程序会及时捕捉并加以处理。
            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;
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员的小黑板

请作者喝一杯咖啡吧

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值