1.redis的订阅发布者

1.redis控制台实现

subscribe c1 c2 c3 订阅 c1 c2 c3

spring boot 实现redis的订阅发布者模式 - 图1

publish c1 “hello” 对c1 发消息

spring boot 实现redis的订阅发布者模式 - 图2

spring boot 实现redis的订阅发布者模式 - 图3

spring boot 实现redis的订阅发布者模式 - 图4

2.代码实现

1.pom和配置文件和代码目录
  1. <dependency>
  2. <groupId>org.springframework.boot</groupId>
  3. <artifactId>spring-boot-starter-data-redis</artifactId>
  4. </dependency>
  1. ## redis所在的服务器IP
  2. spring.redis.host= 127.0.0.1
  3. ## 端口
  4. spring.redis.port= 6379
  5. ##密码,我这里没有设置,所以不填
  6. spring.redis.password=
  7. ## 设置最大连接数,0为无限
  8. spring.redis.pool.max-active=8

spring boot 实现redis的订阅发布者模式 - 图5

2.配置配置文件
  1. @Configuration
  2. public class RedisConfig {
  3. /**
  4. * redis消息监听器容器
  5. * 可以添加多个监听不同话题的redis监听器,只需要把消息监听器和相应的消息订阅处理器绑定,该消息监听器
  6. * 通过反射技术调用消息订阅处理器的相关方法进行一些业务处理
  7. * @param connectionFactory
  8. * @param recvAdapter1 第一个监听器
  9. * @param recvAdapter2 第二个监听器
  10. * @return
  11. */
  12. @Bean
  13. RedisMessageListenerContainer container(RedisConnectionFactory connectionFactory,
  14. MessageListenerAdapter recvAdapter1 , MessageListenerAdapter recvAdapter2
  15. ) {
  16. RedisMessageListenerContainer container = new RedisMessageListenerContainer();
  17. container.setConnectionFactory(connectionFactory);
  18. container.addMessageListener(recvAdapter1, new PatternTopic("chat1"));//将订阅者1与chat频道绑定
  19. container.addMessageListener(recvAdapter2, new PatternTopic("chat2"));//将订阅者2与chat2频道绑定
  20. //这个container 可以添加多个 messageListener
  21. return container;
  22. }
  23. /**
  24. * 消息监听器适配器,绑定消息处理器,利用反射技术调用消息处理器的业务方法
  25. * @param receiver
  26. * @return
  27. */
  28. @Bean
  29. MessageListenerAdapter recvAdapter1(Recv receiver){
  30. //也有好几个重载方法,这边默认调用处理器的方法 叫handleMessage 可以自己到源码里面看
  31. return new MessageListenerAdapter(receiver, "recvMsg1");
  32. }
  33. @Bean
  34. MessageListenerAdapter recvAdapter2(Recv receiver){
  35. //也有好几个重载方法,这边默认调用处理器的方法 叫handleMessage 可以自己到源码里面看
  36. return new MessageListenerAdapter(receiver, "recvMsg2");
  37. }
  38. /**redis 读取内容的template 这边跟本工程无关,可以不配置*/
  39. @Bean
  40. StringRedisTemplate template(RedisConnectionFactory connectionFactory) {
  41. return new StringRedisTemplate(connectionFactory);
  42. }
  43. }

3.消费者的实现
  1. @Component
  2. public class Recv{
  3. public void recvMsg1(String msg){ //具体操作方法 名称随意
  4. System.out.println("收到消息1:"+msg);
  5. }
  6. public void recvMsg2(String msg){ //具体操作方法 名称随意
  7. System.out.println("收到消息2:"+msg);
  8. }
  9. }

4.编写测试类
  1. @EnableScheduling //开启定时器功能
  2. @Component
  3. public class MessageSender {
  4. @Autowired
  5. private StringRedisTemplate stringRedisTemplate;
  6. @Scheduled(fixedRate = 2000) //间隔2s 通过StringRedisTemplate对象向redis消息队列chat频道发布消息
  7. public void sendMessage(){
  8. stringRedisTemplate.convertAndSend("chat1",String.valueOf(Math.random()));
  9. stringRedisTemplate.convertAndSend("chat2",String.valueOf(Math.random()));
  10. }
  11. }

5.结果

spring boot 实现redis的订阅发布者模式 - 图6