RocketMQ是阿里巴巴开源的消息分布中间件,在阿里内部使用非常更广泛,已经经过了“双11”这种万亿级的应用场景考验。
下载地址:http://rocketmq.apache.org/release_notes/release-notes-4.4.0/
下载完成后解压缩安装包到指定目录。
(1)环境变量:ROCKETMQ_HOME
(2)Path
切换到当前下载RocketMQ的bin目录下
(1)启动NameServer ---> start mqnamesrv.cmd
(2)启动Broker ---> start mqbroker.cmd -n 127.0.0.1:9876 autoCreateTopicEnable=true
看下面这张图
RocketMQ整体分为4个角色,NameServer、Broker、Producer、Consumer、
Broker:为RocketMQ的核心,负责消息的接受,存储,投递等功能。
NameServer:消息队列的协商者,Broker向它注册路由信息,同时Producer和Consumer向其获取路由信息。
Producer:消息的生产者,需要从NameServer获取Borker信息,然后与Broker建立连接,向Broker发送消息。
Consumer:消息的消费者,需要从NameServer获取Broker信息,然后与Broker建立连接,从Broker获取消息。
另外还包括别的组件,
Topic:用来区分不同的消息类型,发送和接收消息前都要先创建Topic,针对Topic来发送和接收消息。
Message Queue:消息队列,一个Topic可以设置一个或多个MessageQueue,这样消息就可以并行往各个Message Queue发送消息,消费者也可以并行的从多个Message Queue读取消息,提高性能和吞吐量。
Message:消息的载体。
搭建好SpringBoot项目后,先导入RocketMQ所需的依赖:
-
- <dependency>
- <groupId>org.apache.rocketmqgroupId>
- <artifactId>rocketmq-clientartifactId>
- <version>4.4.0version>
- dependency>
5.1 同步发送
同步发送方式比较可靠,应用也比较广泛,比如:重要的消息通知,短信通知。
消息发送方:
- //发送同步消息
- public class RocketMQSendTest1 {
- public static void main(String[] args) throws MQClientException, RemotingException, InterruptedException, MQBrokerException {
- //1.创建消息生产者,指定生产者所属的组名
- DefaultMQProducer producer = new DefaultMQProducer("myproducer-group");
- //2.指定Nameserver地址
- producer.setNamesrvAddr("127.0.0.1:9876");
- //3.启动生产者
- producer.start();
- for (int i = 0; i < 10; i++) {
- Message message = new Message("myTopic", "myTag", ("十行代码九个错误八个警告竟敢说七日精通六天学会五湖四海也不见如此三心二意之程序简直一等下流" + i).getBytes());
- //发送消息
- SendResult sendResult = producer.send(message);
- System.out.println(sendResult);
- }
-
- //关闭生产者
- producer.shutdown();
- }
- }
消息接收方:
- //接收消息
- public class RocketMQReceiveTest1 {
- public static void main(String[] args) throws MQClientException {
- //创建消息消费者。指定消费者所属的组名
- DefaultMQPushConsumer consumer = new DefaultMQPushConsumer("myconsumer-group");
- //指定Nameserver地址
- consumer.setNamesrvAddr("127.0.0.1:9876");
- //指定消费者订阅的主题和标签
- consumer.subscribe("myTopic", "*");
-
- //设置回调函数,编写处理消息的方法
- consumer.registerMessageListener(new MessageListenerConcurrently() {
- @Override
- public ConsumeConcurrentlyStatus consumeMessage(List
list, ConsumeConcurrentlyContext consumeConcurrentlyContext) { - System.out.println("获取到的消费数据:" + list);
- System.out.println(new String(list.get(0).getBody()));
- return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;
- }
- });
-
- //启动消息消费者
- consumer.start();
- System.out.println("Consumer Starting.");
- }
- }
启动时,切记先启动消费者(接收方),再启动生产者(发送方)。
启动测试,同步发送消息结果:
5.2 异步消息
异步消息通常用在对响应时间敏感的业务场景,即发送端不能容忍长时间地等待Broker的响应。
发送方:
- //发送异步消息
- //异步消息比较浪费性能,经常会失败,所以多发送几次并且让线程休眠几秒
- public class RocketMQSendTest2 {
-
- public static void main(String[] args) throws MQClientException, RemotingException, InterruptedException {
- //1.创建消息生产者,指定生产者所属的组名
- DefaultMQProducer producer = new DefaultMQProducer("myproducer-group");
- //2.设置NameServer地址
- producer.setNamesrvAddr("127.0.0.1:9876");
- //3.启动生产者
- producer.start();
- for (int i = 0; i < 10; i++) {
- //4.创建消息对象,制定主题、标签、消息体
- Message message = new Message("myTopic", "myTag2", ("十行代码九个错误八个警告竟敢说七日精通六天学会五湖四海也不见如此三心二意之程序简直一等下流").getBytes());
- //5.发送消息
- producer.send(message, new SendCallback() {
- @Override
- public void onSuccess(SendResult sendResult) {
- System.out.println("发送成功:" + sendResult);
- }
-
- @Override
- public void onException(Throwable e) {
- System.out.println("发送异常:" + e);
- }
- });
-
- //休眠
- TimeUnit.SECONDS.sleep(3);
- }
-
- //6.关闭生产者
- producer.shutdown();
-
- }
- }
接收方:
- public class RocketMQReceiveTest2 {
- public static void main(String[] args) throws MQClientException {
- //1.创建消息消费者,指定消费者所属的组名
- DefaultMQPushConsumer consumer = new DefaultMQPushConsumer("myconsumer-group");
-
- //2.指定Nameserver地址
- consumer.setNamesrvAddr("127.0.0.1:9876");
- //3.指定消费者订阅的主题和标签
- consumer.subscribe("myTopic", "*");
- consumer.setMessageModel(MessageModel.BROADCASTING);
- //4.设置回调函数,编写处理请求的方法
- consumer.registerMessageListener(new MessageListenerConcurrently() {
- @Override
- public ConsumeConcurrentlyStatus consumeMessage(List
list, ConsumeConcurrentlyContext consumeConcurrentlyContext) { -
- System.out.println(new String(list.get(0).getBody()));
- //返回消费状态
- return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;
- }
- });
- //5.启动消息消费者
- consumer.start();
- System.out.println("Consumer Starting.");
-
- }
- }
启动测试,异步发送消息结果:
5.3 单行发送消息
该方式用在不关注发送结果的场景,比如日志发送。
- //单行发送消息
- public class RocketMQSendTest3 {
- public static void main(String[] args) throws MQClientException, RemotingException, InterruptedException, MQBrokerException {
- DefaultMQProducer producer = new DefaultMQProducer("myproducer-group");
- producer.setNamesrvAddr("127.0.0.1:9876");
- producer.start();
- for (int i = 0; i < 10; i++) {
- Message message = new Message("myTopic", "myTag3", ("芜湖").getBytes());
- producer.sendOneway(message);
-
- TimeUnit.SECONDS.sleep(3);
- }
- producer.shutdown();
- }
-
- }
启动两个消费者接收10条消息,结果如下:
存在消息丢失的情况。
以上就是对RocketMQ的初步认识啦!