• MessageListenerAdapter--消息监听适配器


    我们把之前的消息监听代码注释,可以不用直接加消息监听,而是采用MessageListenerAdapter的方式,我们来学习下如何使用默认的handleMessage,自定义方法名,自定义转换器。

    适配器方式一:

            //设置消息监听
    //        container.setMessageListener(new ChannelAwareMessageListener() {
    //            @Override
    //            public void onMessage(Message message, Channel channel) throws Exception {
    //                String msg = new String(message.getBody(), "utf-8");
    //                System.out.println("-----------消费者:" + msg);
    //            }
    //        });
            
            //1.适配器方式:默认是有自己的方法的名字的:handleMessage
            MessageListenerAdapter adapter = new MessageListenerAdapter(new MessageDelegate());
            container.setMessageListener(adapter);

    MessageListenerAdapter 可以通过适配器,适配自己的实现,这里我们适配自定义的MessageDelegate类。我们就可以不采用监听的方式,采用适配的方式。

    自定义MessageDelegate

    public class MessageDelegate {
        
        public void handleMessage(String messageBody) {
            System.err.println("handleMessage默认方法,消息内容 String:" + messageBody);
        }
    }

    MessageListenerAdapter源码分析

    我们来看下MessageListenerAdapter底层代码

    MessageListenerAdapter类中

    public static final String ORIGINAL_DEFAULT_LISTENER_METHOD = "handleMessage";

    默认方法名就是叫handleMessage。当然也可以自己去指定设置。通过messageListenerAdapter的代码我们可以看出如下核心属性

    • defaultListenerMethod默认监听方法名称:用于设置监听方法名称
    • Delegate 委托对象:实际真实的委托对象,用于处理消息
    • queueOrTagToMethodName 队列标识与方法名称组成集合
    • 可以一一进行队列与方法名称的匹配
    • 队列和方法名称绑定,即指定队列里的消息会被绑定的方法所接受处理

    运行测试类:

        @Test
        public void testMessage02() {
            //创建消息
            MessageProperties messageProperties = new MessageProperties();
            messageProperties.setContentType("text/plain");
            Message message = new Message("spring 消息".getBytes(), messageProperties);
            rabbitTemplate.send("topic001", "spring.abc", message);
            
            rabbitTemplate.convertAndSend("topic001", "spring.amqp", "hello object message send!");
        }

    运行结果:

     自定义MessageListenerAdapter类中的默认方法名defaultListenerMethod:

            MessageListenerAdapter adapter = new MessageListenerAdapter(new MessageDelegate());
            adapter.setDefaultListenerMethod("consumeMessage");
            container.setMessageListener(adapter);

    那么MessageDelegate类中的方法名要做修改:

    public class MessageDelegate {    
        public void consumeMessage(String messageBody) {
            System.err.println("consumeMessage默认方法,消息内容:" + messageBody);
        }
    }

    适配器方式二:

            //2 适配器方式:我们的队列名称和(MessageDelegate)方法名称也可以一一的匹配
            MessageListenerAdapter adapter = new MessageListenerAdapter(new MessageDelegate());
            Map<String, String> queueOrTagToMethodName = new HashMap<>();
            queueOrTagToMethodName.put("queue001", "method01");
            queueOrTagToMethodName.put("queue002", "method02");
            adapter.setQueueOrTagToMethodName(queueOrTagToMethodName);
            container.setMessageListener(adapter);

    那么MessageDelegate类中的方法名要做修改:

    public class MessageDelegate {
        public void method01(String messageBody) {
            System.err.println("method01 收到消息内容:" + messageBody);
        }
        
        public void method02(String messageBody) {
            System.err.println("method02 收到消息内容:" + messageBody);
        }
    }

    测试代码:

        @Test
        public void testMessage03() {
            //创建消息
            MessageProperties messageProperties = new MessageProperties();
            messageProperties.setContentType("text/plain");
            Message message = new Message("spring-dwz 消息".getBytes(), messageProperties);
            rabbitTemplate.send("topic001", "spring.abc", message);
            rabbitTemplate.send("topic002", "rabbit.abc", message);
        }

     参考文章:

    RabbitMQ整合Spring AMQP实战!(全)

  • 相关阅读:
    springboot的build.gradle增加阿里仓库地址以及eclipse增加lombok
    mqttfx无法选择证书
    EMQX源码编译过程
    新环境chart包helmlint校验
    安装rebar3
    Ubuntu16.04下,erlang安装和rabbitmq安装步骤
    UTF-8,GBK,ANSI之间的关系和区别
    write命令
    bunzip2命令
    bzip2命令
  • 原文地址:https://www.cnblogs.com/zheaven/p/11911377.html
Copyright © 2020-2023  润新知