個人學習系列 - Spring Boot 配合 Redis 實現簡單的釋出訂閱功能

周兆東發表於2022-03-05
如果只是想實現簡單的釋出訂閱功能的話,又不想用訊息佇列增加系統的複雜性,我們可以選擇Redis來做這個事情。

釋出訂閱

釋出訂閱模式就是一種生產者消費者模式,Publisher負責生產訊息,而Subscriber則負責消費它所訂閱的訊息。
image.png

pom.xml

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-pool2</artifactId>
</dependency>

<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>1.18.22</version>
</dependency>

application.yml

server:
  # 埠號配置
  port: 8080
spring:
  # redis配置
  redis:
    database: 0
    host: 127.0.0.1
    port: 6379
    password:

訊息生產者

/**
 * 訊息生產者
 * @author zhouzhaodong
 */
@RestController
public class RedisController {

    private final RedisTemplate<String, String> redisTemplate;

    public RedisController(RedisTemplate<String, String> redisTemplate) {
        this.redisTemplate = redisTemplate;
    }

    @GetMapping("/publish")
    public void publish(@RequestParam String message) {
        // 傳送訊息
        // 下面這裡需要配置傳送的CHANNEL名稱
        redisTemplate.convertAndSend("helloMessage", message);
    }

}

訊息消費者

/**
 * 訊息消費者
 * @author zhouzhaodong
 */
@Slf4j
@Service
public class MessageSubscriber {

    public MessageSubscriber(RedisTemplate redisTemplate) {
        RedisConnection redisConnection = redisTemplate.getConnectionFactory().getConnection();
        redisConnection.subscribe((message, bytes) -> {
            // 收到訊息的處理邏輯
            log.info("Receive message : " + message);
            // 下面這裡需要配置接收的CHANNEL名稱
        }, "helloMessage".getBytes(StandardCharsets.UTF_8));

    }

}

測試

呼叫介面生產訊息
image.png
控制檯列印消費者收到的訊息
image.png

個人部落格地址

http://www.zhouzhaodong.xyz/

程式碼地址

https://gitee.com/zhouzhaodon...

相關文章