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实战!(全)

原文地址:https://www.cnblogs.com/zheaven/p/11911377.html