共计 1538 个字符,预计需要花费 4 分钟才能阅读完成。
如果只是想实现简略的公布订阅性能的话,又不想用音讯队列减少零碎的复杂性,咱们能够抉择 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));
}
}
测试
调用接口生产音讯
控制台打印消费者收到的音讯
集体博客地址
http://www.zhouzhaodong.xyz/
代码地址
https://gitee.com/zhouzhaodon…
正文完