使用Spring实现Redis的发布/订阅功能

3.7 Redis的Sub/Pub

3.7.1 Receiver类
public class Receiver {
          
   
    private static final Logger logger = LogManager.getLogger(Receiver.class);
    	/*
         用处:假如有10个订阅者,就设置为10,这样每当一个订阅者接收之后调用latch.cutDown()
         发布者发布方法最后调用latch.await(),即所有订阅者都接受到消息方法结束
         */
    private CountDownLatch latch;

    public void setLatch(CountDownLatch latch) {
          
   
        this.latch = latch;
    }

    public void receiveMessage(String message){
          
   
        // 可以在这里执行一些操作,比如向某些用户发送信息
        logger.info("receive"+message);
        latch.countDown();
    }


}
3.7.2 RedisConfig.java
//**************pub/sub*************
 /*
  * 信息的接受者
  * */
 @Bean
 public RedisMessageListenerContainer listenerContainer(){
          
   
     RedisMessageListenerContainer container = new RedisMessageListenerContainer();

     container.setConnectionFactory(connectionFactory());
     // addMessageListener(监听器,监听的频道),可以有多个Listener
     container.addMessageListener(messageListenerAdapter(),new PatternTopic("zyy"));

     return container;
 }

@Bean
 public MessageListenerAdapter messageListenerAdapter(){
          
   
    // MessageListenerAdapter(监听实例,监听的方法)
    return new MessageListenerAdapter(receiver(),"receiveMessage");
}
 @Bean
 public Receiver receiver(){
          
   
     Receiver receiver = new Receiver();

      receiver.setLatch(latch());
        return receiver;
    }
    @Bean
    CountDownLatch latch(){
          
   
        return new CountDownLatch(1); //灵活的设置值
    }
3.7.3 测试类
public class SubPubTest extends BaseTest {
          
   
    @Autowired
    private StringRedisTemplate template;
    @Autowired
    CountDownLatch latch;

    @Test
    public void test() throws InterruptedException {
          
   
        // 模拟服务器向某个监听器发送信息,这里会执行Receiver类的receiveMessage方法
        template.convertAndSend("zyy","hello SubPub!");
        latch.await();  //直到CountDownLatch的值为0才停止
    }
}
3.7.4 总结
先建立接受者,可以认为是一个有若干个方法(receiveMessage)的普通类(Receiver),将类装载到Spring容器中 需要配置一个监听器(MessageListenerAdapter),并告诉监听器哪个类(Receiver)接受信息,以及处理信息的方法名(receiveMessage) 配置监听器容器(RedisMessageListenerContainer),将监听器加入到容器中,还要告诉该监听器负责监听的关键话题(new PatternTopic(“zyy”)),可以是Topic的任一个实现类,但关键字只能为字符串
3.7.5 CountDownLatch类
辅助监听器:每次发送给一个订阅者就执行cutDown(),到0就意味着全部发送完毕
经验分享 程序员 微信小程序 职场和发展