我有一个应用程序,它使用spring AMQP来消费并向其他应用程序生成消息 . 我有一个场景,其中发生了一些异常我需要重新排队回RabbitMQ . 对于一些我需要忽略的例外(基本上我需要忽略不需要重新排队的消息)
目前在下面的代码中,我已将配置设置为
factory.setDefaultRequeueRejected(false);
但我的要求是动态拒绝某些消息并重新排队回RabbitMQ以获取某些消息 .
请建议
@Bean(name="rabbitListenerContainerFactory")
public SimpleRabbitListenerContainerFactory rabbitListenerContainerFactory() {
SimpleRabbitListenerContainerFactory factory = new SimpleRabbitListenerContainerFactory();
factory.setConnectionFactory(connectionFactory());
Jackson2JsonMessageConverter messageConverter = new Jackson2JsonMessageConverter();
DefaultClassMapper classMapper = new DefaultClassMapper();
Map<String, Class<?>> idClassMapping = new HashMap<String, Class<?>>();
idClassMapping.put(Constants.JOB_TYPE_ID_, JobListenerDTO.class);
classMapper.setIdClassMapping(idClassMapping);
messageConverter.setClassMapper(classMapper);
factory.setMessageConverter(messageConverter);
factory.setDefaultRequeueRejected(false);
factory.setReceiveTimeout(10L);
return factory;
}
1 回答
你不能这样做(默认为false) .
要有选择地执行此操作,您必须将
defaultRequeueRejected
设置为true
并为要丢弃的任何内容抛出AmqpRejectAndDontRequeueRejected
.您可以将所需的逻辑封装在
ErrorHandler
中 .默认错误处理程序与特定的异常列表完全相同,因为documented here - 您可以注入自定义
FatalExceptionStrategy
.但对于条件拒绝,
defaultRequeueRejected
必须是true
.EDIT
这会将
MyBadXMLException
添加到标准列表中 .如果您不使用Java 8,请使用
new FatalExceptionStrategy() {...}
.