订阅发布模型,工作中应该也是挺常见的,常见的是用MQ去实现,redis也可以简单的实现订阅发布,下文教大家简单的用 spring + redis 来实现一个订阅发布模型。
pom yaml 略,同上文无变化,配置类如下
@AllArgsConstructor
@SpringBootConfiguration
public class RedisPubsubConfig {
private final RedisConnectionFactory redisConnectionFactory;
// spring依赖搜索:可以拿到spring容器中所有RedisMessagePublisher的实现类另外还有Map写法,感兴趣的话,大家可以搜索一下相关内容
private final List redisMessagePublisherList;
// redis消息监听器容器
@Bean
public RedisMessageListenerContainer redisMessageListenerContainer() {
RedisMessageListenerContainer container = new RedisMessageListenerContainer();
container.setConnectionFactory(redisConnectionFactory);
// 统一注册redis消息监听器
redisMessagePublisherList.forEach(redisMessagePublisher -> container.addMessageListener(redisMessagePublisher, redisMessagePublisher.subTopic()));
return container;
}
}
@SpringBootConfiguration
public class RedisPubsubConfig {
@Bean
public RedisMessagePublisher redisMessagePublisher() {
return new RedisMessagePublisher() {
// 订阅的主题
private Topic topic = new ChannelTopic("default-topic");
// 收到消息时的处理器
private BiConsumer messageHandler = (message, pattern) -> {
// 简单输出收到的信息
System.out.println(new String(message.getBody()));
};
@Override
public BiConsumer messageHandler() {
return this.messageHandler;
}
@Override
public Topic subTopic() {
return this.topic;
}
};
}
}
public interface RedisMessagePublisher extends MessageListener {
// 消息处理器,用一个双参的消费型函数式接口来封装
BiConsumer messageHandler();
// 订阅的主题
Topic subTopic();
// 收到消息时,调用消息处理器来进行处理
@Override
default void onMessage(Message message, byte[] pattern) {
messageHandler().accept(message, pattern);
}
}
如上配置,便可实现简单的消息发布订阅,然后在controller层实现一个发布消息的接口,调用
redisTemplate.convertAndSend 往default-topic 主题去发布一个消息,订阅该主题的处理器就会调用了
@GetMapping("/test")
@ResponseBody
public String test() {
redisTemplate.convertAndSend("default-topic", "test message.");
return "success";
}



