qq_32525413 2023-12-04 15:39 采纳率: 0%
浏览 41

RabbitMQ消费者监听报错,如何解决?(语言-java)

最近我在RabbitMQ中遇到了这么一个问题:我开启了两台消费者,在保持一台消费者正常工作的前提下,关闭第二台或者新打开第二台都会在消费第一条消息时报错,并且消息丢失了,目前是手动ACK的模式,报错明细如下:

org.springframework.amqp.rabbit.support.ListenerExecutionFailedException: Listener method 'public final void com.fanyu.common.rabbitmq.ReportResultReceiver$$EnhancerBySpringCGLIB$$1.process(org.springframework.amqp.core.Message,com.rabbitmq.client.Channel) throws java.io.IOException' threw exception
    at org.springframework.amqp.rabbit.listener.adapter.MessagingMessageListenerAdapter.invokeHandler(MessagingMessageListenerAdapter.java:270)
    at org.springframework.amqp.rabbit.listener.adapter.MessagingMessageListenerAdapter.invokeHandlerAndProcessResult(MessagingMessageListenerAdapter.java:207)
    at org.springframework.amqp.rabbit.listener.adapter.MessagingMessageListenerAdapter.onMessage(MessagingMessageListenerAdapter.java:146)
    at org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer.doInvokeListener(AbstractMessageListenerContainer.java:1665)
    at org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer.actualInvokeListener(AbstractMessageListenerContainer.java:1584)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:344)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:198)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163)
    at org.springframework.retry.interceptor.RetryOperationsInterceptor$1.doWithRetry(RetryOperationsInterceptor.java:93)
    at org.springframework.retry.support.RetryTemplate.doExecute(RetryTemplate.java:329)
    at org.springframework.retry.support.RetryTemplate.execute(RetryTemplate.java:225)
    at org.springframework.retry.interceptor.RetryOperationsInterceptor.invoke(RetryOperationsInterceptor.java:116)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)
    at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:215)
    at org.springframework.amqp.rabbit.listener.$Proxy124.invokeListener(Unknown Source)
    at org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer.invokeListener(AbstractMessageListenerContainer.java:1572)
    at org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer.doExecuteListener(AbstractMessageListenerContainer.java:1563)
    at org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer.executeListener(AbstractMessageListenerContainer.java:1507)
    at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer.doReceiveAndExecute(SimpleMessageListenerContainer.java:967)
    at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer.receiveAndExecute(SimpleMessageListenerContainer.java:914)
    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:745)
Caused by: java.lang.IllegalStateException: The mapped handler method class 'com.fanyu.common.rabbitmq.ReportResultReceiver$$EnhancerBySpringCGLIB$$1' is not an instance of the actual endpoint bean class 'com.fanyu.common.rabbitmq.ReportResultReceiver$$EnhancerBySpringCGLIB$$2'. If the endpoint requires proxying (e.g. due to @Transactional), please use class-based proxying.

在网上找了很多文章看都没能看到类似的问题,想问问看有没有道友遇到过并解决的

  • 写回答

3条回答 默认 最新

  • Leodong. 2023-12-04 16:02
    关注

    该回答通过自己思路及引用到GPTᴼᴾᴱᴺᴬᴵ搜索,得到内容具体如下:
    这个问题可能是由于Spring AMQP在处理代理类时出现了问题。你可以尝试使用基于类的代理来解决此问题。

    首先,确保你的ReportResultReceiver类实现了一个接口,例如:

    public interface ReportResultReceiver {
        void process(Message message, Channel channel);
    }
    

    然后,在你的消费者类中,将ReportResultReceiver替换为该接口的实现类:

    @Service
    public class MyConsumer implements ReportResultReceiver {
        // ...
        @Override
        public void process(Message message, Channel channel) {
            // 处理消息的逻辑
        }
    }
    

    接下来,你需要配置RabbitMQ的监听器容器以使用基于类的代理。在你的配置类中,添加以下代码:

    @Configuration
    public class RabbitConfig {
        @Bean
        public MessageListenerContainer messageListenerContainer(ConnectionFactory connectionFactory, ReportResultReceiver receiver) {
            SimpleMessageListenerContainer container = new SimpleMessageListenerContainer();
            container.setConnectionFactory(connectionFactory);
            container.setQueueNames("your_queue_name");
            container.setMessageListener(receiver);
            container.setProxyInterface(ReportResultReceiver.class); // 设置代理接口
            return container;
        }
    }
    

    这样,当RabbitMQ尝试调用ReportResultReceiver的方法时,它将使用基于类的代理,而不是CGLIB代理。这应该可以解决你遇到的问题。


    如果以上回答对您有所帮助,点击一下采纳该答案~谢谢

    评论

报告相同问题?

问题事件

  • 创建了问题 12月4日