Rabbitmq 使用rabbit listener的Spring amqp转换器问题

Rabbitmq 使用rabbit listener的Spring amqp转换器问题,rabbitmq,amqp,spring-amqp,spring-rabbit,Rabbitmq,Amqp,Spring Amqp,Spring Rabbit,我想我遗漏了一些东西。我正在尝试创建一个简单的rabbit listner,它可以接受自定义对象作为消息类型。现在按照医生说的 在1.6之前的版本中,转换JSON的类型信息必须在消息头中提供,或者需要自定义类映射器。从版本1.6开始,如果没有类型信息头,则可以从目标方法参数推断类型 我在仪表板中使用rabbit mq adm手动将消息放入队列,得到如下错误 Caused by: org.springframework.messaging.converter.MessageConversionEx

我想我遗漏了一些东西。我正在尝试创建一个简单的rabbit listner,它可以接受自定义对象作为消息类型。现在按照医生说的

在1.6之前的版本中,转换JSON的类型信息必须在消息头中提供,或者需要自定义类映射器。从版本1.6开始,如果没有类型信息头,则可以从目标方法参数推断类型

我在仪表板中使用rabbit mq adm手动将消息放入队列,得到如下错误

Caused by: org.springframework.messaging.converter.MessageConversionException: Cannot convert from [[B] to [com.example.Customer] for GenericMessage [payload=byte[21], headers={amqp_receivedDeliveryMode=NON_PERSISTENT, amqp_receivedRoutingKey=customer, amqp_deliveryTag=1, amqp_consumerQueue=customer, amqp_redelivered=false, id=81e8a562-71aa-b430-df03-f60e6a37c5dc, amqp_consumerTag=amq.ctag-LQARUDrR6sUcn7FqAKKVDA, timestamp=1485635555742}]
我的配置:

@Bean
    public ConnectionFactory connectionFactory() {
        CachingConnectionFactory connectionFactory = new    CachingConnectionFactory("localhost");
        connectionFactory.setUsername("test");
        connectionFactory.setPassword("test1234");
        connectionFactory.setVirtualHost("/");
        return connectionFactory;
    }

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

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

    @Bean
    public Jackson2JsonMessageConverter jackson2JsonMessageConverter() {
        return new Jackson2JsonMessageConverter();
    }
还有一个问题是,此异常消息不会放回队列中

我使用的是SpringBoot1.4,它带来了AMQP1.6.1

Edit1:我如上所述添加了jackson converter(spring boot不需要prob),并在rmq admin上指定了contenty类型,但仍然在下面,正如您在上面看到的,我还没有配置任何侦听器容器

Caused by: org.springframework.messaging.converter.MessageConversionException: Cannot convert from [[B] to [com.example.Customer] for GenericMessage [payload=byte[21], headers={amqp_receivedDeliveryMode=NON_PERSISTENT, amqp_receivedRoutingKey=customer, content_type=application/json, amqp_deliveryTag=3, amqp_consumerQueue=customer, amqp_redelivered=false, id=7f84d49d-037a-9ea3-e936-ed5552d9f535, amqp_consumerTag=amq.ctag-YSemzbIW6Q8JGYUS70WWtA, timestamp=1485643437271}]

如果您正在使用boot,只需将一个
Jackson2JsonMessageConverter
@Bean
添加到配置中,它就会自动连接到侦听器中(只要它是唯一的转换器)。如果使用管理控制台发送消息,则需要将
content\u type
属性设置为
application/json

默认情况下,转换错误被认为是致命的,因为通常没有理由重试;否则他们将永远循环

编辑

这里有一个工作启动应用程序

@SpringBootApplication
public class So41914665Application {

    public static void main(String[] args) {
        SpringApplication.run(So41914665Application.class, args);
    }

    @Bean
    public Queue queue() {
        return new Queue("foo", false, false, true);
    }

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

    @RabbitListener(queues = "foo")
    public void listen(Foo foo) {
        System.out.println(foo);
    }


    public static class Foo {

        public String bar;

        public String getBar() {
            return this.bar;
        }

        public void setBar(String bar) {
            this.bar = bar;
        }

        @Override
        public String toString() {
            return "Foo [bar=" + this.bar + "]";
        }

    }

}
我发了这个消息

因此:

2017-01-28 21:49:45.509  INFO 11453 --- [           main] com.example.So41914665Application        : Started So41914665Application in 4.404 seconds (JVM running for 5.298)
Foo [bar=baz]

Boot将为您定义一个管理员和模板。

给您-。这将是确定问题的最佳方法。拉动它并尝试一下。您需要将
@Configuration
添加到
RabbitConfig
类中-boot看不到转换器bean,因此不会将其连接。顺便说一句,你不需要管理员和模板bean;boot的自动配置将为您添加它们。您也不需要
连接工厂
;您可以将凭据放在application.yml(或.properties)中。看。当我添加
@Configuration
时,您的示例适用于我。我还建议升级到1.4.4。非常抱歉浪费您的时间:(.我应该更加注意。我会在下一次发布之前进行双重检查。是的,我不需要这些bean只是为了我所做的,但我计划在这方面做更多的试验。