說明:以前背八股文,早就知道 Redis 可以作為消息隊列,本文介紹如何實現用 Redis 作為消息隊列。
介紹
這里直接介紹 yudao 框架中的實現。yudao 是一套現成的開源系統框架,里面集成了許多基礎功能,我們可以在這基礎上實現自己的業務功能,就不用重復造輪子了。
- 芋道微服務代碼部署
將后端代碼 clone 到本地,點開系統的基礎組件,可以看到在消息隊列的模塊中有 redis 實現方式。
使用
(1)Redis版本要求
yudao 使用 Redis 作為消息隊列,利用了 Redis 5.0 版本后的 Stream 類型,所以要求 Redis 版本在該版本之上,可參考 yudao 提供的下面這篇文章安裝:
- Redis 安裝指南(Windows 版本)
下載后,如果你使用的是 windows 操作系統,可使用管理員打開 CMD,敲下面的命令將 Redis 注冊成系統的一個服務
redis-server --service-install ?D:\dev\Redis-x64-5.0.14.1\redis.windows.conf
其中 ?D:\dev\Redis-x64-5.0.14.1\redis.windows.conf
更換成自己的 redis 配置文件路徑
(2)創建消息和監聽器
使用起來很便捷,先創建一個消息對象,繼承框架中的 AbstractRedisChannelMessage
類,如下:
import cn.iocoder.yudao.framework.mq.redis.core.pubsub.AbstractRedisChannelMessage;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;/*** 學生消息*/
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class StudentMessage extends AbstractRedisChannelMessage {private Long id;private String name;private String age;
}
再在需要消費該消息的服務里,寫一個監聽類,繼承 AbstractRedisChannelMessageListener
類,泛型指定為需要監聽的消息對象
import cn.iocoder.yudao.framework.mq.redis.core.pubsub.AbstractRedisChannelMessageListener;
import cn.iocoder.yudao.module.system.controller.admin.demo.message.StudentMessage;
import org.springframework.stereotype.Service;/*** 學生消息監聽器*/
@Service
public class StudentMessageListener extends AbstractRedisChannelMessageListener<StudentMessage> {@Overridepublic void onMessage(StudentMessage message) {System.out.println("收到消息:" + message);}
}
這就完成了,是不是九分甚至十分的便捷?
(3)測試
寫個 DemoController,測試驗證一下
import cn.iocoder.yudao.framework.mq.redis.core.RedisMQTemplate;
import cn.iocoder.yudao.module.system.controller.admin.demo.message.StudentMessage;
import jakarta.annotation.Resource;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
@RequestMapping("/system/demo")
public class DemoController {@Resourceprivate RedisMQTemplate redisMQTemplate;@GetMapping("/hello")public String hello() {return "hello";}@GetMapping("/send")public String send() {StudentMessage studentMessage = new StudentMessage().setId(10001L).setName("zhangsan").setAge("男");redisMQTemplate.send(studentMessage);return "success";}
}
啟動項目,先登錄拿個 token
調用發送消息接口,請求頭上帶上 token,發送消息成功
監聽器消費了消息
擴展
yudao 框架還增加了一個攔截器 RedisMessageInterceptor
,繼承該類,可實現在發送、消費消息前后執行相應業務,如下:
import cn.iocoder.yudao.framework.mq.redis.core.interceptor.RedisMessageInterceptor;
import cn.iocoder.yudao.framework.mq.redis.core.message.AbstractRedisMessage;
import cn.iocoder.yudao.module.system.controller.admin.demo.message.StudentMessage;
import org.springframework.stereotype.Component;/*** 學生消息攔截器*/
@Component
public class StudentMessageInterceptor implements RedisMessageInterceptor {@Overridepublic void sendMessageBefore(AbstractRedisMessage message) {if (message instanceof StudentMessage) {System.out.println("發送消息前。。。。。");}}@Overridepublic void sendMessageAfter(AbstractRedisMessage message) {if (message instanceof StudentMessage) {System.out.println("發送消息后。。。。。");}}@Overridepublic void consumeMessageBefore(AbstractRedisMessage message) {if (message instanceof StudentMessage) {System.out.println("消費消息前。。。。。");}}@Overridepublic void consumeMessageAfter(AbstractRedisMessage message) {if (message instanceof StudentMessage) {System.out.println("消費消息后。。。。。");}}
}
比如,可以將發送消息、消費消息記錄到數據庫表中
總結
本文介紹了 yudao 框架里如何用 Redis 作為消息隊列