1.redis的订阅发布者
1.redis控制台实现
subscribe c1 c2 c3 订阅 c1 c2 c3
publish c1 “hello” 对c1 发消息
2.代码实现
1.pom和配置文件和代码目录
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
## redis所在的服务器IP
spring.redis.host= 127.0.0.1
## 端口
spring.redis.port= 6379
##密码,我这里没有设置,所以不填
spring.redis.password=
## 设置最大连接数,0为无限
spring.redis.pool.max-active=8
2.配置配置文件
@Configuration
public class RedisConfig {
/**
* redis消息监听器容器
* 可以添加多个监听不同话题的redis监听器,只需要把消息监听器和相应的消息订阅处理器绑定,该消息监听器
* 通过反射技术调用消息订阅处理器的相关方法进行一些业务处理
* @param connectionFactory
* @param recvAdapter1 第一个监听器
* @param recvAdapter2 第二个监听器
* @return
*/
@Bean
RedisMessageListenerContainer container(RedisConnectionFactory connectionFactory,
MessageListenerAdapter recvAdapter1 , MessageListenerAdapter recvAdapter2
) {
RedisMessageListenerContainer container = new RedisMessageListenerContainer();
container.setConnectionFactory(connectionFactory);
container.addMessageListener(recvAdapter1, new PatternTopic("chat1"));//将订阅者1与chat频道绑定
container.addMessageListener(recvAdapter2, new PatternTopic("chat2"));//将订阅者2与chat2频道绑定
//这个container 可以添加多个 messageListener
return container;
}
/**
* 消息监听器适配器,绑定消息处理器,利用反射技术调用消息处理器的业务方法
* @param receiver
* @return
*/
@Bean
MessageListenerAdapter recvAdapter1(Recv receiver){
//也有好几个重载方法,这边默认调用处理器的方法 叫handleMessage 可以自己到源码里面看
return new MessageListenerAdapter(receiver, "recvMsg1");
}
@Bean
MessageListenerAdapter recvAdapter2(Recv receiver){
//也有好几个重载方法,这边默认调用处理器的方法 叫handleMessage 可以自己到源码里面看
return new MessageListenerAdapter(receiver, "recvMsg2");
}
/**redis 读取内容的template 这边跟本工程无关,可以不配置*/
@Bean
StringRedisTemplate template(RedisConnectionFactory connectionFactory) {
return new StringRedisTemplate(connectionFactory);
}
}
3.消费者的实现
@Component
public class Recv{
public void recvMsg1(String msg){ //具体操作方法 名称随意
System.out.println("收到消息1:"+msg);
}
public void recvMsg2(String msg){ //具体操作方法 名称随意
System.out.println("收到消息2:"+msg);
}
}
4.编写测试类
@EnableScheduling //开启定时器功能
@Component
public class MessageSender {
@Autowired
private StringRedisTemplate stringRedisTemplate;
@Scheduled(fixedRate = 2000) //间隔2s 通过StringRedisTemplate对象向redis消息队列chat频道发布消息
public void sendMessage(){
stringRedisTemplate.convertAndSend("chat1",String.valueOf(Math.random()));
stringRedisTemplate.convertAndSend("chat2",String.valueOf(Math.random()));
}
}