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實戰!(全)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM