美文网首页
Redis01--实现发布订阅

Redis01--实现发布订阅

作者: Spring_java | 来源:发表于2019-07-26 22:31 被阅读0次

    最近无聊,写了篇关于redis的发布订阅相关的文章

    类似消息队列,只是没有ack

    接触到的角色有
    1:消息监听的容器

    • 可以添加多个监听不同话题的redis监听器,只需要把消息监听器和相应的消息订阅处理器绑定,
    • 该消息监听器 通过反射技术调用消息订阅处理器的相关方法进行一些业务处理
      2:消息监听器适配器,绑定消息处理器,利用反射技术调用消息处理器的业务方法
      3:消息的接收者

    1:监听的容器代码

    /**
         * redis消息监听器容器
         * 可以添加多个监听不同话题的redis监听器,只需要把消息监听器和相应的消息订阅处理器绑定,该消息监听器
         * 通过反射技术调用消息订阅处理器的相关方法进行一些业务处理
         * @param connectionFactory
         * @param userListenerAdapter
         * @return
         */
        @Bean
        public RedisMessageListenerContainer container(JedisConnectionFactory connectionFactory,
                                                       MessageListenerAdapter userListenerAdapter) {
            RedisMessageListenerContainer container = new RedisMessageListenerContainer();
            container.setConnectionFactory(connectionFactory);
            container.addMessageListener(userListenerAdapter, new PatternTopic("user"));
            return container;
        }
    
    
        /**
         * 消息监听器适配器,绑定消息处理器,利用反射技术调用消息处理器的业务方法
         * @param receiver
         * @return
         */
        @Bean
        public MessageListenerAdapter userListenerAdapter(UserReceiver receiver) {
    
            //这个地方 是给messageListenerAdapter 传入一个消息接受的处理器,
            // 利用反射的方法调用“receiveMessage”
            //也有好几个重载方法,
            // 这边默认调用处理器的方法 叫handleMessage 可以自己到源码里面看
    
            return new MessageListenerAdapter(receiver, "receiveMessage");
        }
    
    
        /**
         * 具体的接受者
         * @return
         */
        @Bean
        public UserReceiver userReceiver() {
            return new UserReceiver();
        }
    

    2: 消息发布者

    @Component
    public class Publisher {
        @Autowired
        RedisTemplate redisTemplate;
    
        public void pushMessage(String topic, Message message) {
            redisTemplate.convertAndSend(topic,message);
    
        }
    }
    

    3:消息的接收者

    @Slf4j
    public class UserReceiver extends AbstractReceiver{
    
        private Logger logger= LoggerFactory.getLogger(this.getClass());
    
    
        @Override
        public void receiveMessage(Object message) {
    
            System.out.println("=====================================");
    
            System.out.println("接收到商品消息:"+JSON.toJSONString(message));
    //        logger.info("接收到商品消息:{}", JSON.toJSONString(message));
    
        }
    }
    

    4: 测试发送

    public class RedisTest {
    
        @Autowired
        Publisher publisher;
    
    
        @Test
        public void testSend(){
            Message msg=new Message();
            msg.setMsg("test001");
            msg.setName("redis");
            publisher.pushMessage("user", msg);
        }
    }
    

    启动程序,启动测试类。OK

    相关文章

      网友评论

          本文标题:Redis01--实现发布订阅

          本文链接:https://www.haomeiwen.com/subject/ssujrctx.html