我有一个应用程序,它使用spring AMQP来消费并向其他应用程序生成消息。 我有一个场景,其中发生了一些异常我需要重新排队回RabbitMQ。对于一些我需要忽略的例外(基本上我需要忽略不需要重新排队的消息)
目前在以下代码中, 我已将配置设置为
factory.setDefaultRequeueRejected(假);
但我的要求是动态拒绝某些消息并重新排队回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;
}
答案 0 :(得分:4)
你无法这样做(默认为false)。
要有选择地执行此操作,您必须将defaultRequeueRejected
设置为true
并为您想要丢弃的任何内容抛出AmqpRejectAndDontRequeueRejected
。
您可以将所需的逻辑封装在ErrorHandler
。
默认错误处理程序与特定的例外列表完全相同,因为documented here - 您可以注入自定义FatalExceptionStrategy
。
但对于条件拒绝,defaultRequeueRejected
必须为true
。
修改强>
factory.setErrorHandler(new ConditionalRejectingErrorHandler(t -> {
Throwable cause = t.getCause();
return cause instanceof MessageConversionException
|| cause instanceof org.springframework.messaging.converter.MessageConversionException
|| cause instanceof MethodArgumentNotValidException
|| cause instanceof MethodArgumentTypeMismatchException
|| cause instanceof NoSuchMethodException
|| cause instanceof ClassCastException
|| cause instanceof MyBadXMLException;
}));
这会将MyBadXMLException
添加到标准列表中。
如果您不使用Java 8,请使用new FatalExceptionStrategy() {...}
。