springboot 2.*中使用适配器添加自定义方法时,实际执行的还是handleMessage
来源:4-9 SpringAMQP消息适配器-MessageListenerAdapter使用-2

月光下的初恋
2019-02-18
碰到一个很奇怪的问题,直接run或者不打断点时会抛异常,打断点debug运行时又不会抛异常。麻烦老师帮忙看看是不是spring和rabbit整个的问题,spring-boot的具体版本号是2.0.6.RELEASE,spring-cloud-starter-stream-rabbit版本号是2.0.1.RELEASE
具体配置如下:
config:
@Bean
public CachingConnectionFactory connectionFactory() {
CachingConnectionFactory connectionFactory = new CachingConnectionFactory();
connectionFactory.setHost("**********");
connectionFactory.setVirtualHost("/");
connectionFactory.setUsername("admin");
connectionFactory.setPassword("123456");
return connectionFactory;
}
@Bean
public Queue queue_01() {
return new Queue("queue_01",true);
}
@Bean
public TopicExchange exchange_01() {
return new TopicExchange("exchange_01", true, false);
}
@Bean
public Binding binding_01() {
return BindingBuilder.bind(queue_01()).to(exchange_01()).with("quan.*");
}
@Bean
public SimpleMessageListenerContainer container(ConnectionFactory connectionFactory) {
SimpleMessageListenerContainer container = new SimpleMessageListenerContainer(connectionFactory);
container.setQueues(queue_01());
container.setConcurrentConsumers(1);
container.setMaxConcurrentConsumers(10);
container.setDefaultRequeueRejected(false);//重回队列
container.setAcknowledgeMode(AcknowledgeMode.AUTO);
container.setConsumerTagStrategy(s -> s + "_" + System.currentTimeMillis());
MessageListenerAdapter adapter = new MessageListenerAdapter(new MessageDelegate());
adapter.setMessageConverter(new TextMessageConverter());
Map<String,String> queueOrTagToMethodName = new HashMap<>();
queueOrTagToMethodName.put("queue_01","method_text");
adapter.setQueueOrTagToMethodName(queueOrTagToMethodName);
container.setMessageListener(adapter);
return container;
}
messgaeDelegate代码如下:
public void handleMessage(byte[] body) {
System.err.println("默认方法:" + new String(body));
}
public void consumerMessage(byte[] body) {
System.err.println("自定义方法:" + new String(body));
}
public void consumerMessage(String msg) {
System.err.println("String:" + msg);
}
public void consumerMessage(OrderDetail orderDetail) {
System.err.println("订单明细:" + orderDetail.toString());
}
public void method_text(String msg) {
System.err.println("独立方法:" + msg);
}
TextMessageConverter代码如下
@Override
public Message toMessage(Object o, MessageProperties messageProperties) throws MessageConversionException {
return new Message(o.toString().getBytes(),messageProperties);
}
@Override
public Object fromMessage(Message message) throws MessageConversionException {
String contentType = message.getMessageProperties().getContentType();
if (null != contentType && contentType.contains("text")) {
return new String(message.getBody());
}
return message.getBody();
}
测试代码
@Test
public void testTextSend() throws Exception {
MessageProperties messageProperties = new MessageProperties();
messageProperties.setContentType("text/plain");
String msg = "还是不行啊";
Message message = new Message(msg.getBytes(), messageProperties);
rabbitTemplate.send("exchange_01", "quan.hehe", message);
}
异常信息
org.springframework.amqp.rabbit.listener.exception.FatalListenerExecutionException: Invalid listener
at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer$AsyncMessageProcessingConsumer.run(SimpleMessageListenerContainer.java:1082) ~[spring-rabbit-2.0.8.RELEASE.jar:2.0.8.RELEASE]
at java.lang.Thread.run(Thread.java:748) [na:1.8.0_191]
Caused by: org.springframework.amqp.rabbit.listener.exception.ListenerExecutionFailedException: Failed to invoke target method 'handleMessage' with argument type = [class java.lang.String], value = [{还是不行啊}]
at org.springframework.amqp.rabbit.listener.adapter.MessageListenerAdapter.invokeListenerMethod(MessageListenerAdapter.java:393) ~[spring-rabbit-2.0.8.RELEASE.jar:2.0.8.RELEASE]
at org.springframework.amqp.rabbit.listener.adapter.MessageListenerAdapter.onMessage(MessageListenerAdapter.java:298) ~[spring-rabbit-2.0.8.RELEASE.jar:2.0.8.RELEASE]
at org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer.doInvokeListener(AbstractMessageListenerContainer.java:1414) ~[spring-rabbit-2.0.8.RELEASE.jar:2.0.8.RELEASE]
at org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer.actualInvokeListener(AbstractMessageListenerContainer.java:1337) ~[spring-rabbit-2.0.8.RELEASE.jar:2.0.8.RELEASE]
at org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer.invokeListener(AbstractMessageListenerContainer.java:1324) ~[spring-rabbit-2.0.8.RELEASE.jar:2.0.8.RELEASE]
at org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer.executeListener(AbstractMessageListenerContainer.java:1303) ~[spring-rabbit-2.0.8.RELEASE.jar:2.0.8.RELEASE]
at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer.doReceiveAndExecute(SimpleMessageListenerContainer.java:817) ~[spring-rabbit-2.0.8.RELEASE.jar:2.0.8.RELEASE]
at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer.receiveAndExecute(SimpleMessageListenerContainer.java:801) ~[spring-rabbit-2.0.8.RELEASE.jar:2.0.8.RELEASE]
at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer.access$700(SimpleMessageListenerContainer.java:77) ~[spring-rabbit-2.0.8.RELEASE.jar:2.0.8.RELEASE]
at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer$AsyncMessageProcessingConsumer.run(SimpleMessageListenerContainer.java:1042) ~[spring-rabbit-2.0.8.RELEASE.jar:2.0.8.RELEASE]
... 1 common frames omitted
Caused by: java.lang.NoSuchMethodException: com.rabbit.demo.delegate.MessageDelegate.handleMessage(java.lang.String)
at java.lang.Class.getMethod(Class.java:1786) ~[na:1.8.0_191]
at org.springframework.util.MethodInvoker.prepare(MethodInvoker.java:181) ~[spring-core-5.0.10.RELEASE.jar:5.0.10.RELEASE]
at org.springframework.amqp.rabbit.listener.adapter.MessageListenerAdapter.invokeListenerMethod(MessageListenerAdapter.java:371) ~[spring-rabbit-2.0.8.RELEASE.jar:2.0.8.RELEASE]
... 10 common frames omitted
写回答
1回答
-
月光下的初恋
提问者
2019-02-19
spring boot 升级到2.1.3就没有这个问题了
012019-03-16
相似问题