RocketMQ入坑指南(二):JAVA接入RocketMQ

前言

上篇内容介绍了RocketMQ的基础知识和单机启动方式,同时也也简单介绍了监控仪表盘RocketMQ Dashboard,这次主要介绍java中如何接入RocketMQ的。由于SpringBoot提供的Starter集成度太高,屏蔽了大量细节,不建议上来直接学习,我们先通过RocketMQ-Client整合,了解基本使用方法,后期再学习SpringBoot的整合。

RocketMQ整合

1.首先先导入rocketmq-client包

<dependency>
    <groupId>org.apache.rocketmq</groupId>
    <artifactId>rocketmq-client</artifactId>
    <version>4.9.4</version>
</dependency>

2.编写生产者代码

import 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;

public class Producer {

    public static void producer() {
        //创建DefaultMQProducer消息生产者对象
        DefaultMQProducer producer = new DefaultMQProducer("TestProducerGroup");
        //设置NameServer 多个节点间用分号分割
        producer.setNamesrvAddr("192.168.2.5:9876");
        try {
            //与NameServer建立长连接
            producer.start();
            //发送一百条数据
            for (int i = 1; i <= 100; 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) {
            }
        }
    }

    public static void main(String[] args) {
        Producer.producer();;
    }
}

执行之后,可以看到如下信息

3.编写消费者代码

MQ的消费模式可以大致分为两种,一种是推Push,一种是拉Pull。

  • Push是服务端主动推送消息给客户端,优点是及时性较好,但如果客户端没有做好流控,一旦服务端推送大量消息到客户端时,就会导致客户端消息堆积甚至崩溃。

  • Pull是客户端需要主动到服务端取数据,优点是客户端可以依据自己的消费能力进行消费,但拉取的频率也需要用户自己控制,拉取频繁容易造成服务端和客户端的压力,拉取间隔长又容易造成消费不及时。

Apache RocketMQ既提供了Push模式也提供了Pull模式。

(1)push推送模式

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("192.168.2.5: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();
    }
}

(2)pull拉取模式

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("192.168.2.5: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();
    }
}

两种方式大家都可以试一下,结果如下:

总结

这篇主要介绍的是RocketMQ最基础的使用方式,目的在于让大家能更好的理解运行的方式,后面的章节,我们会慢慢的深入学习。

接下来将详细的介绍生产者的相关知识

关注我,不迷路

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

程序员的小黑板

请作者喝一杯咖啡吧

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

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

打赏作者

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

抵扣说明:

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

余额充值