我們把之前的消息監聽代碼注釋,可以不用直接加消息監聽,而是采用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); }
參考文章:
