我觉得这里可能有些问题...我正在尝试创建一个简单的rabbit listener,可以接受自定义对象作为消息类型。现在根据文档所说:
在1.6版本之前,必须在消息头中提供类型信息以将JSON转换,或者需要一个自定义的ClassMapper。从1.6版本开始,如果没有类型信息头,则可以从目标方法参数中推断类型。
我手动将消息放入队列,使用RabbitMQ面板得到错误消息:
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();
}
另外一个问题是,这个异常消息没有被放回队列中。
我正在使用 Spring Boot 1.4,它带有 AMQP 1.6.1。
Edit1:我已经像上面那样添加了 Jackson 转换器(在 Spring Boot 中可能不需要),并在 RabbitMQ 管理界面上设置了内容类型,但仍然收到以下错误,正如您在上面看到的,我还没有配置任何监听器容器。
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}]
RabbitConfig
类中添加@Configuration
注解 - 否则boot无法看到转换器bean,因此也无法将其连接。顺便说一下,你不需要admin和template beans;boot的自动配置会为你添加它们。你也不需要一个ConnectionFactory
;你可以将你的凭据放在application.yml(或.properties)中。请参阅boot参考文档关于RabbitMQ自动配置。当我添加了@Configuration
时,你的示例对我有效。我还建议升级到1.4.4。 - Gary Russell