如果只是想實現簡單的釋出訂閱功能的話,又不想用訊息佇列增加系統的複雜性,我們可以選擇Redis來做這個事情。
釋出訂閱
釋出訂閱模式就是一種生產者消費者模式,Publisher負責生產訊息,而Subscriber則負責消費它所訂閱的訊息。
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));
}
}
測試
呼叫介面生產訊息
控制檯列印消費者收到的訊息