如果只是想实现简略的公布订阅性能的话,又不想用音讯队列减少零碎的复杂性,咱们能够抉择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: 8080spring: # redis配置 redis: database: 0 host: 127.0.0.1 port: 6379 password:
音讯生产者
/** * 音讯生产者 * @author zhouzhaodong */@RestControllerpublic 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@Servicepublic 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...