我们把之前的消息监听代码注释,可以不用直接加消息监听,而是采用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); }
参考文章: