版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/he37176427/article/details/84973508
redis的发布订阅模式,使发布者和订阅者完全解耦
首先项目依赖和配置文件
pom.xml 引入redis依赖 application.properties略
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
首先订阅者需要自己实现具体操作方法,并注册为bean
@Component
public class Recv(){
public void recvMsg(String msg){ //具体操作方法 名称随意
System.out.println("收到消息:"+msg);
}
}
然后需要一个 RedisMessageListenerContainer监听容器来将订阅者与指定频道绑定
@Configuration
public class RedisConfig {
@Bean
RedisMessageListenerContainer container(RedisConnectionFactory connectionFactory,
MessageListenerAdapter recvAdapter) {
RedisMessageListenerContainer container = new RedisMessageListenerContainer();
container.setConnectionFactory(connectionFactory);
container.addMessageListener(recvAdapter, new PatternTopic("channel1"));//将订阅者1与channel1频道绑定
return container;
}
@Bean
MessageListenerAdapter recvAdapter(Recv receiver){ //与channel1绑定的适配器
return new MessageListenerAdapter(receiver, "recvMsg");/*收到消息时执行Recv类中的
recvMsg方法*/
}
@Bean
StringRedisTemplate template(RedisConnectionFactory connectionFactory) {
return new StringRedisTemplate(connectionFactory);
}
}
这样,频道和订阅者 订阅者处理数据的方法就绑定好了,接下来向指定频道中发送数据时,订阅这个频道的所有client都会收到消息并执行绑定的方法。
@Componet
public class Sender(){
@Autowired
private StringRedisTemplate stringRedisTemplate;
/*当这个方法被调用时,将会发布消息到channel1 然后订阅者执行对应的方法
这里就会在控制台打印hello world*/
public void send(){
stringRedisTemplate.convertAndSend("channel1","hello world");
}
}