Redis訊息佇列實現,基於Spring Boot和RedisTemplate實現自動配置
技術標籤:springboot
簡介
某些場景下我們無法使用訊息中介軟體提供訊息佇列功能,而需要使用Redis實現訊息佇列的功能時,可以引用該專案https://github.com/jo8tony/redis-mq#redis-mq實現訊息佇列功能。
這是一個使用基於Redis列表資料型別實現的具有訊息佇列功能的專案,該專案建立在Spring Boot框架之上,通過Spring提供的RedisTemplate功能訪問Redis服務,並利用Spring Boot自動配置的功能可以方便的注入其他專案中使用。
如何使用
1.克隆並打包
首先,你需要將專案克隆到本地,並且通過maven打包併發布到本地maven庫中。
# 克隆專案
git clone https://github.com/jo8tony/redis-mq.git
# 在專案根目錄下執行下面命令打包釋出
mvn install
2.引入到專案
接下來需要這自己的Spring Boot專案中映入該工程的jar包。這裡我們建立一個測試用的Spring Boot工程redis-mq-test。
<dependency>
<groupId>top.aolien</groupId>
<artifactId>redismq-spring-boot-starter</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
3.新增配置
redis-mq依賴一旦引入到專案中便具有了它提供的訊息佇列功能,接下來需要新增一些redis相關的基本配置。redis-mq使用的是Spring提供的RedisTemplate的功能,所以參照該功能相關配置即可。
spring:
redis:
host: 127.0.0.1
port: 6379
PS:如果關閉Redis訊息佇列的功能可以刪除上面的jar包依賴,或者在配置檔案中新增配置
redis:
queue:
listener :
enable: false #true表示開啟redis訊息佇列監聽功能
4.訊息生產者示例
在測試工程redis-mq-test中建立普通java類Student,用於作為redis訊息傳遞,當然也可以任意類,但是該類需要實現序列化介面Serializable
@Data
@Accessors(chain = true)
@ToString
public class Student implements Serializable {
private static final long serialVersionUID = 1L;
private Long id;
private String name;
private String sex;
private Integer age;
}
然後建立一個TestController類,最作為web專案的介面用於傳送給redis訊息測試。
PS:redis訊息傳送的方法是RedisMQUtil.send(引數1,引數2)
方法,引數1是String型別的訊息佇列名稱,引數2是實現序列化介面的你想傳遞的任意資料。
@RestController
public class TestController {
@Autowired
private RedisMQUtil redisMQUtil;
@RequestMapping("/send/msg")
public String sendQueueMessage1(){
Student student = new Student()
.setId(88888888L)
.setName("jo8tony")
.setSex("男")
.setAge(18);
redisMQUtil.send("queue-1", student);
return "SUCCESS";
}
@RequestMapping("/send/msg2")
public String sendQueueMessage2(){
Student student = new Student()
.setId(99999999L)
.setName("小紅")
.setSex("女")
.setAge(20);
redisMQUtil.send("queue-2", student);
return "SUCCESS";
}
}
5.訊息消費者示例
建立一個RedisListenerContainer類用於定義redis佇列訊息監聽處理方法。
PS: 實現redis佇列監聽只需在Spring容器所管理的Bean中的方法上添加註解@RedisListener(引數1)
,引數1是一個String型別的佇列名稱並且不能為空,表示該方法你需要處理的哪個佇列的訊息。注意被@RedisListener修飾的方法只能包含一個引數,這個引數的可以一個top.aolien.redis.mq.RedisMessage
型別的引數,也可以是你需要傳遞的直接訊息型別,例如這裡的Student。
@Component
public class RedisListenerContainer {
@RedisListener("queue-1")
public void dealRedisMessage0(RedisMessage msg) {
System.out.println("dealRedisMessage0收到queue-1佇列訊息: " + msg.toString());
}
@RedisListener("queue-1")
public void dealRedisMessage1(Student student) {
System.out.println("dealRedisMessage1收到queue-1佇列訊息: " + student.toString());
}
@RedisListener("queue-2")
public void dealRedisMessage2(RedisMessage<Student> msg) {
System.out.println("dealRedisMessage2收到queue-2佇列訊息: " + msg.toString());
}
}
**注意:**你可以定義多個帶有@RedisListener(引數1)註解的方法,並且引數1相同,注意如果這樣該佇列中的同一訊息會被這些方法重複消費。分散式叢集環境中不同程式監聽同一佇列,同一條訊息只會被其中一個程式上的所有監聽該佇列的方法消費。
6.測試
完成以上步驟後啟動測試專案redis-mq-test,可以看到如下日誌,表示訊息佇列監聽已啟動成功
然後在瀏覽器中輸入http://localhost:8080/send/msg
地址,向佇列queue-1中傳送一條學生資訊的訊息,觀察控制檯結果:
這裡應為定義了兩個queue-1佇列的處理方法dealRedisMessage0和方法dealRedisMessage1,所以訊息被這兩個方法重複消費了。
接著在瀏覽器中輸入http://localhost:8080/send/msg2
地址,向佇列queue-2中傳送一條學生資訊的訊息,觀察控制檯結果: