如果只是想实现简略的公布订阅性能的话,又不想用音讯队列减少零碎的复杂性,咱们能够抉择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…
发表回复