无限循环抛出 No method found for class [B 这个异常

问题描述

  • 写入RabbitMQ消息
    在这里插入图片描述
  • 接收RabbitMQ消息类型 String
@RabbitHandler
public void receive(String message) {
	if (StringUtils.isEmpty(message)) {
    	return;
    }
    // 业务代码
}
  • 上面配置导致无限循环抛出异常如下
[08:57:05.502][DEBUG][o.s.a.r.listener.BlockingQueueConsumer][org.springframework.amqp.rabbit.RabbitListenerEndpointContainer#0-1] Received message: (Body:'[B@d5b8d16(byte[223])' MessageProperties [headers={}, contentLength=0, redelivered=true, receivedExchange=exchange.canal, receivedRoutingKey=canal-routing-key, deliveryTag=450, consumerTag=amq.ctag-x079bMTfxizFn_WM75rJyw, consumerQueue=mes_warning_message])
[08:57:05.502][DEBUG][o.s.a.r.l.a.MessagingMessageListenerAdapter][org.springframework.amqp.rabbit.RabbitListenerEndpointContainer#0-1] Processing [GenericMessage [payload=byte[223], headers={amqp_receivedRoutingKey=canal-routing-key, amqp_receivedExchange=exchange.canal, amqp_deliveryTag=450, amqp_consumerQueue=mes_warning_message, amqp_redelivered=true, id=e14a2efd-12d0-1c7d-2c1b-43b9f6432c28, amqp_consumerTag=amq.ctag-x079bMTfxizFn_WM75rJyw, amqp_lastInBatch=false, timestamp=1639011425502}]]
[08:57:05.502][DEBUG][o.s.a.r.listener.BlockingQueueConsumer][pool-2-thread-6] Received cancelOk for tag amq.ctag-x079bMTfxizFn_WM75rJyw (mes_warning_message); Consumer@34114276: tags=[[amq.ctag-x079bMTfxizFn_WM75rJyw]], channel=Cached Rabbit Channel: AMQChannel(amqp://test@127.0.0.1:5672/,1), conn: Proxy@42db3ff Shared Rabbit Connection: SimpleConnection@23dda7a3 [delegate=amqp://test@127.0.0.1:5672/, localPort= 50086], acknowledgeMode=AUTO local queue size=0
[08:57:05.502][DEBUG][o.s.a.r.l.SimpleMessageListenerContainer][org.springframework.amqp.rabbit.RabbitListenerEndpointContainer#0-1] Listener exception after container shutdown
org.springframework.amqp.rabbit.support.ListenerExecutionFailedException: Listener threw exception
	at org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer.wrapToListenerExecutionFailedExceptionIfNeeded(AbstractMessageListenerContainer.java:1699)
	at org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer.doInvokeListener(AbstractMessageListenerContainer.java:1589)
	at org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer.actualInvokeListener(AbstractMessageListenerContainer.java:1504)
	at org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer.invokeListener(AbstractMessageListenerContainer.java:1492)
	at org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer.doExecuteListener(AbstractMessageListenerContainer.java:1483)
	at org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer.executeListener(AbstractMessageListenerContainer.java:1427)
	at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer.doReceiveAndExecute(SimpleMessageListenerContainer.java:970)
	at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer.receiveAndExecute(SimpleMessageListenerContainer.java:916)
	at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer.access$1600(SimpleMessageListenerContainer.java:83)
	at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer$AsyncMessageProcessingConsumer.mainLoop(SimpleMessageListenerContainer.java:1291)
	at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer$AsyncMessageProcessingConsumer.run(SimpleMessageListenerContainer.java:1197)
	at java.lang.Thread.run(Thread.java:748)
Caused by: org.springframework.amqp.AmqpException: No method found for class [B
	at org.springframework.amqp.rabbit.listener.adapter.DelegatingInvocableHandler.getHandlerForPayload(DelegatingInvocableHandler.java:151)
	at org.springframework.amqp.rabbit.listener.adapter.DelegatingInvocableHandler.getMethodFor(DelegatingInvocableHandler.java:270)
	at org.springframework.amqp.rabbit.listener.adapter.HandlerAdapter.getMethodFor(HandlerAdapter.java:84)
	at org.springframework.amqp.rabbit.listener.adapter.MessagingMessageListenerAdapter.invokeHandlerAndProcessResult(MessagingMessageListenerAdapter.java:146)
	at org.springframework.amqp.rabbit.listener.adapter.MessagingMessageListenerAdapter.onMessage(MessagingMessageListenerAdapter.java:133)
	at org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer.doInvokeListener(AbstractMessageListenerContainer.java:1585)
	... 10 common frames omitted

原因

  • 接收消息信息类型错误,将String 类型改为 byte[]

解决办法

  • 新增RabbItConfig配置文件,完成JSON格式的String转成字节码
import org.springframework.amqp.rabbit.config.SimpleRabbitListenerContainerFactory;
import org.springframework.amqp.rabbit.connection.ConnectionFactory;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.amqp.support.converter.Jackson2JsonMessageConverter;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class RabbitConfig {

    @Bean
    public RabbitTemplate rabbitTemplate(ConnectionFactory connectionFactory) {
        RabbitTemplate template = new RabbitTemplate(connectionFactory);
        template.setMessageConverter(new Jackson2JsonMessageConverter());
        return template;
    }

    @Bean
    public SimpleRabbitListenerContainerFactory rabbitListenerContainerFactory(ConnectionFactory connectionFactory) {
        SimpleRabbitListenerContainerFactory factory = new SimpleRabbitListenerContainerFactory();
        factory.setConnectionFactory(connectionFactory);
        factory.setMessageConverter(new Jackson2JsonMessageConverter());
        return factory;
    }
}
  • 用字节码数组接收,并转换为String
    @RabbitHandler
    public void receive(byte[] result) {

        String message = null;
        try {
            message = new String(result, StandardCharsets.UTF_8.name());
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }

        if (StringUtils.isEmpty(message)) {
            return;
        }
   }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

dadeity

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值