1. 程式人生 > 其它 >Redis訊息佇列實現,基於Spring Boot和RedisTemplate實現自動配置

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中傳送一條學生資訊的訊息,觀察控制檯結果:
在這裡插入圖片描述