我们都熟悉 Redis
的缓存功能,如果你还未了解过可以先过一遍之前的文章: Spring Boot 集成 Redis 缓存。但与 Kafka
一样, Redis
同样支持发布订阅功能,下面介绍如何在 Spring Boot
项目中实现 Redis
的发布订阅功能。
1. 依赖导入
在开始之前需要引入 Redis
的相关依赖。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
2. 订阅者
在发送消息之前首先要创建订阅着以接收消息,这里我创建了两个订阅者。
(1) 订阅者一
新建订阅类 ListenerTest1
并实现 MessageListener
接口,重写 onMessage()
方法,用于编写接收消息的具体处理逻辑。
public class ListenerTest1 implements MessageListener {
Logger logger = LoggerFactory.getLogger(ListenerTest1.class);
@Override
public void onMessage(Message message, byte[] pattern) {
logger.info("订阅者 - 1号, 接收到消息:" + new String(message.getBody()));
}
}
(2) 订阅者二
同理新建第二个订阅类 ListenerTest2
。
public class ListenerTest2 implements MessageListener {
Logger logger = LoggerFactory.getLogger(ListenerTest2.class);
@Override
public void onMessage(Message message, byte[] pattern) {
logger.info("订阅者 - 2号,接收到消息:" + new String(message.getBody()));
}
}
3. 配置文件
新建配置类 ChannelConfig
实现订阅者于通道 Topic
的绑定。
@Configuration
public class ChannelConfig {
/**
* 配置类中注入连接工厂
*/
@Autowired
private LettuceConnectionFactory connectionFactory;
/**
* 建立频道与监听器关系
*/
@Bean
public RedisMessageListenerContainer redisMessageListenerContainer() {
RedisMessageListenerContainer container = new RedisMessageListenerContainer();
// 注入连接工厂
container.setConnectionFactory(connectionFactory);
// 频道绑定监听器 1 号
container.addMessageListener(new ListenerTest1(), new ChannelTopic("myChannel-1"));
// 频道绑定监听器 2 号
container.addMessageListener(new ListenerTest2(), new ChannelTopic("myChannel-2"));
return container;
}
}
4. 发送者
新建测试接口,通过 convertAndSend()
方法发送消息,当发送消息时订阅者便会在日志中打印接收的信息。
如下示例中分别添加了两个示例接口 /send1
于 /send2
用于往不同的通道发送消息。
@RestController
@RequestMapping("/api/redis/channel")
public class SendTest {
@Autowired
private RedisTemplate redisTemplate;
@GetMapping("/send1")
public void channel1(@RequestParam("message") String message) {
// 发送消息
redisTemplate.convertAndSend("myChannel-1", message);
}
@GetMapping("/send2")
public void channel2(@RequestParam("message") String message) {
// 发送消息
redisTemplate.convertAndSend("myChannel-2", message);
}
}