前言

RocketMQ是阿里巴巴在2012年开源的分布式消息中间件,记录下SpringBoot整合RocketMQ的方式,RocketMQ的安装可以查看:Windows下安装RocketMQ

环境

SpringBoot2.5.3 + RocketMQ4.7.0

具体实现

  • pom.xml
<!-- rocketmq -->
<dependency>
<groupId>org.apache.rocketmq</groupId>
<artifactId>rocketmq-client</artifactId>
<version>4.7.0</version>
</dependency>
  • application.yml
rocketmq:
producer:
producer-group: CoisiniProducerGroup
consumer:
consumer-group: CoisiniConsumerGroup
namesrv-addr: 127.0.0.1:9876
  • MQ生产者
import org.apache.rocketmq.client.exception.MQClientException;
import org.apache.rocketmq.client.producer.DefaultMQProducer;
import org.apache.rocketmq.client.producer.SendResult;
import org.apache.rocketmq.common.message.Message;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import javax.annotation.PostConstruct;
import java.util.Objects; /**
* @Description MQ生产者
* @author coisini
* @date Aug 25, 2021
* @Version 1.0
*/
@Component
public class ProducerSchedule { private DefaultMQProducer producer; @Value("${rocketmq.producer.producer-group}")
private String producerGroup; @Value("${rocketmq.namesrv-addr}")
private String nameSrvAddr; public ProducerSchedule() { } /**
* 生产者构造
* @PostConstruct该注解被用来修饰一个非静态的void()方法
* Bean初始化的执行顺序:
* Constructor(构造方法) -> @Autowired(依赖注入) -> @PostConstruct(注释的方法)
*/
@PostConstruct
public void defaultMQProducer() {
if (Objects.isNull(this.producer)) {
this.producer = new DefaultMQProducer(this.producerGroup);
this.producer.setNamesrvAddr(this.nameSrvAddr);
} try {
this.producer.start();
System.out.println("Producer start");
} catch (MQClientException e) {
e.printStackTrace();
}
} /**
* 消息发布
* @param topic
* @param tag
* @param messageText
* @return
*/
public String send(String topic, String messageText){
Message message = new Message(topic, messageText.getBytes()); /**
* 延迟消息级别设置
* messageDelayLevel=1s 5s 10s 30s 1m 2m 3m 4m 5m 6m 7m 8m 9m 10m 20m 30m 1h 2h
*/
message.setDelayTimeLevel(4); SendResult result = null;
try {
result = this.producer.send(message);
System.out.println("MessageQueue: " + result.getMessageQueue());
System.out.println("MsgId: " + result.getMsgId());
System.out.println("SendStatus: " + result.getSendStatus());
} catch (Exception e) {
e.printStackTrace();
} return result.getMsgId();
}
}
  • MQ消费者
import org.apache.rocketmq.client.consumer.DefaultMQPushConsumer;
import org.apache.rocketmq.client.consumer.listener.ConsumeConcurrentlyStatus;
import org.apache.rocketmq.client.consumer.listener.MessageListenerConcurrently;
import org.apache.rocketmq.client.exception.MQClientException;
import org.apache.rocketmq.common.message.Message;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.CommandLineRunner;
import org.springframework.stereotype.Component; /**
* @Description MQ消费者
* CommandLineRunner 初始化预加载数据
* @author coisini
* @date Aug 25, 2021
* @Version 1.0
*/
@Component
public class ConsumerSchedule implements CommandLineRunner { @Value("${rocketmq.consumer.consumer-group}")
private String consumerGroup; @Value("${rocketmq.namesrv-addr}")
private String nameSrvAddr; public void messageListener() throws MQClientException {
DefaultMQPushConsumer consumer = new DefaultMQPushConsumer(this.consumerGroup);
consumer.setNamesrvAddr(this.nameSrvAddr); /**
* 订阅主题
*/
consumer.subscribe("Topic", "*"); /**
* 设置消费消息数
*/
consumer.setConsumeMessageBatchMaxSize(1); /**
* 注册消息监听
*/
consumer.registerMessageListener((MessageListenerConcurrently) (messages, context) -> {
for (Message message : messages) {
System.out.println("监听到消息:" + new String(message.getBody()));
}
return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;
}); consumer.start();
} @Override
public void run(String... args) throws Exception {
this.messageListener();
}
}
  • 测试接口
@RestController
@RequestMapping("/test")
public class TestController { @Autowired
private ProducerSchedule producerSchedule; @GetMapping("/push")
public void pushMessageToMQ() throws Exception {
producerSchedule.send("Topic", "Coisini");
}
}
  • 接口调用:

  • 30s后延迟消息触发:

- End -



梦想是咸鱼
关注一下吧

SpringBoot - 集成RocketMQ实现延迟消息队列的更多相关文章

  1. 阿里云RocketMQ定时/延迟消息队列实现

    新的阅读体验:http://www.zhouhong.icu/post/157 一.业务需求 需要实现一个提前二十分钟通知用户去做某件事的一个业务,拿到这个业务首先想到的最简单得方法就是使用Redis ...

  2. 基于redis的延迟消息队列设计

    需求背景 用户下订单成功之后隔20分钟给用户发送上门服务通知短信 订单完成一个小时之后通知用户对上门服务进行评价 业务执行失败之后隔10分钟重试一次 类似的场景比较多 简单的处理方式就是使用定时任务 ...

  3. 滴滴出行基于RocketMQ构建企业级消息队列服务的实践

    小结: 1. https://mp.weixin.qq.com/s/v6NM3UgX-qTI7yO1QPCJrw 滴滴出行基于RocketMQ构建企业级消息队列服务的实践 原创: 江海挺 阿里巴巴中间 ...

  4. 基于redis的延迟消息队列设计(转)

    需求背景 用户下订单成功之后隔20分钟给用户发送上门服务通知短信 订单完成一个小时之后通知用户对上门服务进行评价 业务执行失败之后隔10分钟重试一次 类似的场景比较多 简单的处理方式就是使用定时任务 ...

  5. rabbitmq的延迟消息队列实现

    第一部分:延迟消息的实现原理和知识点 使用RabbitMQ来实现延迟任务必须先了解RabbitMQ的两个概念:消息的TTL和死信Exchange,通过这两者的组合来实现上述需求. 消息的TTL(Tim ...

  6. Delayer 基于 Redis 的延迟消息队列中间件

    Delayer 基于 Redis 的延迟消息队列中间件,采用 Golang 开发,支持 PHP.Golang 等多种语言客户端. 参考 有赞延迟队列设计 中的部分设计,优化后实现. 项目链接:http ...

  7. SpringBoot之ActiveMQ实现延迟消息

    一.安装activeMQ ​ 安装步骤参照网上教程,本文不做介绍 二.修改activeMQ配置文件 ​ broker新增配置信息 schedulerSupport="true" & ...

  8. laravel的延迟消息队列

    laravel的延迟消息队列 这篇来自于看到朋友转的58沈剑的一篇文章:1分钟实现"延迟消息"功能(http://mp.weixin.qq.com/s?__biz=MjM5ODYx ...

  9. SpringBoot笔记十四:消息队列

    目录 什么是消息队列 消息队列的作用 异步通信 应用解耦 流量削峰 RabbitMQ RabbitMQ流程简介 RabbitMQ的三种模式 安装RabbitMQ RabbitMQ交换器路由和队列的创建 ...

随机推荐

  1. 「Ynoi2015」我回来了

    「Ynoi2015」我回来了 这东西已经不是 Ynoi 了,因为太水被嫌弃了. 如何提升自己的数据结构能力?从Ynoi做起 题目链接 其实这个题很小清新的辣,而且不卡常. 由于边权为 \(1\),所以 ...

  2. C++ 标准模板库(STL)——容器(Containers)的用法及理解

    C++ 标准模板库(STL)中定义了通用的模板类和函数,这些模板类和函数可以实现多种流行和常用的算法和数据结构,如向量(vector).队列(queue).栈(stack).set.map等.这次主要 ...

  3. PYTHON IDLE同时运行两个PY,互不影响

    1.打开指定文件夹 2.右击a1.py,用IDLE打开(idle1) 3.右击a2.py,用IDLE打开(idle2) 4.则分别按F5运行,则两个互不影响. 5.再用IDLE1打开新程序,用IDLE ...

  4. Kettle——简介

    Kettle是一款国外开源的ETL工具,纯java编写,可以在Window.Linux.Unix上运行,数据抽取高效稳定 Kettle 的主作者是 Matt ,他在 2003 年就开始了这个项目,在  ...

  5. Innodb 锁的介绍

    如下博文是参考如下博文内容,再加整理. http://blog.chinaunix.net/uid-24111901-id-2627857.html http://blog.csdn.net/wang ...

  6. VSCode 使用

    运行时,如何弹出cmd命令窗口:将launch.json文件中的 externalConsole设置为true,并按F5运行(不要按右上角的运行按钮) 如何cin:先再命令窗口通过g++ *.cpp生 ...

  7. 前端基础js(四)

    一. js [1] html:用于显示页面 [2] css:用于描述页面的样式 [3] javaScript:用于描述页面的行为 二.js中三大部分内容 [1] 基本语法:函数.对象.事件类型(变量, ...

  8. java高级编程笔记(四)

    java的Object类: 1.Object 类位于 java.lang 包中,编译时会自动导入:Java 的所有类都继承了 Object,子类可以使用 Object 的所有方法. 2.Object ...

  9. 第四十九篇 -- 添加联系人信息Addcontact

    往通讯录里添加联系人 首先,在清单文件里添加读写权限 <uses-permission android:name="android.permission.READ_CONTACTS&q ...

  10. XSS靶机1

    参考文章https://blog.csdn.net/weixin_30897079/article/details/97314476 第一关 http://www.zixem.altervista.o ...