【问题标题】:Spring AMQP Error: Listener method could not be invoked with the incoming messageSpring AMQP 错误:无法使用传入消息调用侦听器方法
【发布时间】:2018-01-15 16:30:57
【问题描述】:

我有课:

public class MqMessage implements Serializable{
    private String event;
    private String absolutePath;
    private boolean isDirectory;
    private Integer hash;
    private Node node;

    get/set

}

配置类: 公共类 RabbitConfiguration {

@Bean
public ConnectionFactory connectionFactory() {
    CachingConnectionFactory connectionFactory =
            new CachingConnectionFactory("localhost");
    return connectionFactory;
}

@Bean
public AmqpAdmin amqpAdmin() {
    return new RabbitAdmin(connectionFactory());
}

@Bean
public RabbitTemplate rabbitTemplate() {
    RabbitTemplate template = new RabbitTemplate(connectionFactory());
    template.setExchange("exchange-events");
    return template;
}

//объявляем очередь
@Bean
public Queue myQueue1() {
    return new Queue("queue-events");
}

@Bean
public FanoutExchange fanoutExchangeA() {
    return new FanoutExchange("exchange-events");
}

@Bean
public Binding binding1() {
    return BindingBuilder.bind(myQueue1()).to(fanoutExchangeA());
}

发送消息

    public class ServerHandler implements EventHandler {

        //сама структура отражающая состояние файлов, содеражащая метоы для работы с ними
        @Autowired
        Node fileTreeRoot;

        SimpleMessageConverter simpleMessageConverter;

        @Override
        public void setRoot(Node fileTreeRoot) {
            this.fileTreeRoot = fileTreeRoot;
        }
        @Autowired
        RabbitTemplate rabbitTemplate;

        //логика обработки событий
        @Override
        public void eventHandle(String event, String path) {

            /*bussines-logick
*/
            rabbitTemplate.setExchange("exchange-events");

            rabbitTemplate.convertAndSend(new MqMessage(event,fileTreeRoot));
            return;
        }

        public ServerHandler() {

    }

听众:

public class Client {
Node rootNodeClient = new Node();
EventHandler handlerClient = new ClientHandler();


@RabbitListener(queues = "queue-events")
public void onMessage(MqMessage message) {
    System.out.println(message.getNode().hashCode());
    rootNodeClient = message.getNode();
}

一个有错误只启动应用程序

2017-08-08 12:58:02.128 WARN 5024 --- [cTaskExecutor-1] s.a.r.l.ConditionalRejectingErrorHandler : 执行 Rabbit 消息 监听失败。

org.springframework.amqp.rabbit.listener.exception.ListenerExecutionFailedException: 无法使用传入消息调用侦听器方法

原因: org.springframework.messaging.handler.annotation.support.MethodArgumentNotValidException: 无法解析公共 void 中索引 0 处的方法参数 prcjt.client.Client.onMessage(prcjt.message.MqMessage): 1 错误: [对象'消息'中的错误:代码[];论据 [];默认消息 [有效载荷值不能为空]]

错误并不总是存在 请帮忙

【问题讨论】:

    标签: java spring spring-boot rabbitmq spring-amqp


    【解决方案1】:
    Caused by: org.springframework.messaging.handler.annotation.support.MethodArgumentNotValidException: Could not resolve method parameter at index 0
    

    从异常信息来看,spring似乎无法正确解析listener中的MqMessage,可以尝试在客户端添加一个mappingJackson2MessageConverter。参考this link

    【讨论】:

    • 我认为故事完全相反-Payload value must not be empty。这意味着为侦听器容器配置的转换后无法正确反序列化主体。看起来RabbitTemplate 使用默认的SimpleMessageConverter 并使用标准的JAva 序列化序列化MqMessage,但容器工厂基于其他一些转换器,甚至可能提到mappingJackson2MessageConverter。您绝对应该在消费者端使用相同的转换器
    【解决方案2】:

    使用mappingJackson2MessageConverted 对我不起作用。经过大量调查发现我使用了错误的转换器。在 Listener 服务中添加以下代码,它对我有用。

    @Bean
    public Jackson2JsonMessageConverter converter() {
        return new Jackson2JsonMessageConverter();
    }
    

    【讨论】:

      【解决方案3】:

      我遇到这个问题有几个原因:

      1. 不使用“实现可序列化”(我看到您已经在使用)

      2. 模型类中没有构造函数。 (使用空构造函数)

        public ClassToGetQData() {
            super();
            // TODO Auto-generated constructor stub
        }
        

      此外,使用@JsonIgnoreProperties(ignoreUnknown = true) 帮助我解决了传入数据中缺少的数据元素。

      【讨论】:

        猜你喜欢
        • 2019-02-25
        • 2020-01-17
        • 2022-01-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-11-20
        • 2022-06-13
        • 2018-05-03
        相关资源
        最近更新 更多