注释方法的消息转换
在调用监听器之前,流水线中有两个转换步骤。第一步使用消息转换器以改造即将到来的春季AMQP消息到Spring的信息传递消息. 当目标方法被调用时,消息有效载荷会如有需要被转换为方法参数类型。
默认消息转换器第一步是春季AMQP简易消息转换器该系统处理转换为字符串和java.io.Serializable对象。 其他所有内容仍为字节[]. 在接下来的讨论中,我们称之为“消息转换器”。
第二步的默认转换器是通用消息转换器,该服务委托给一个转换服务(一个实例DefaultFormattingConversionService). 在接下来的讨论中,我们称之为“方法参数转换器”。
要更改消息转换器,你可以将其作为属性添加到容器工厂豆中。以下示例展示了如何更改:
@Bean
public SimpleRabbitListenerContainerFactory rabbitListenerContainerFactory() {
SimpleRabbitListenerContainerFactory factory = new SimpleRabbitListenerContainerFactory();
...
factory.setMessageConverter(new Jackson2JsonMessageConverter());
...
return factory;
}
这对Jackson2转换器进行了配置,期望有报头信息来指导转换。
你也可以使用内容类型委托消息转换器,可以处理不同内容类型的转换。
从2.3版本开始,你可以通过在消息转换器财产。
@Bean
public Jackson2JsonMessageConverter jsonConverter() {
return new Jackson2JsonMessageConverter();
}
@RabbitListener(..., messageConverter = "jsonConverter")
public void listen(String in) {
...
}
这样就不用为了更换转换器而申报另一个集装箱工厂了。
在大多数情况下,除非你想使用自定义转换服务.
在1.6之前的版本中,转换JSON的类型信息必须在消息头中提供,或者 习惯ClassMapper是必需的。从版本1.6开始,如果没有类型信息头,可以从目标方法参数推断出该类型。
这种类型推断仅适用于@RabbitListener在方法层面。 |
看Jackson2JsonMessageConverter更多信息请见。
如果你想自定义方法论元转换器,可以按以下方式作:
@Configuration
@EnableRabbit
public class AppConfig implements RabbitListenerConfigurer {
...
@Bean
public DefaultMessageHandlerMethodFactory myHandlerMethodFactory() {
DefaultMessageHandlerMethodFactory factory = new DefaultMessageHandlerMethodFactory();
factory.setMessageConverter(new GenericMessageConverter(myConversionService()));
return factory;
}
@Bean
public DefaultConversionService myConversionService() {
DefaultConversionService conv = new DefaultConversionService();
conv.addConverter(mySpecialConverter());
return conv;
}
@Override
public void configureRabbitListeners(RabbitListenerEndpointRegistrar registrar) {
registrar.setMessageHandlerMethodFactory(myHandlerMethodFactory());
}
...
}
| 对于多方法监听器(参见多方法监听器),方法选择基于消息转换后的有效载荷。方法参数转换器只有在方法被选中后才调用。 |