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就没有这个问题了

0
1
小草1434
如果是版本 spring boot 2.1.0.RELEASE 版本呢
2019-03-16
共1条回复

RabbitMQ精讲 从0到1驾驭RabbitMQ应用与设计

从0到1,全面深入掌握RabbitMQ消息中间件技术

1460 学习 · 443 问题

查看课程