首页 文章

对RabbitMQ队列的否定确认使用Spring AMQP重新排队消息

提问于
浏览
0

我有一个应用程序,它使用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 回答

  • 4

    你不能这样做(默认为false) .

    要有选择地执行此操作,您必须将 defaultRequeueRejected 设置为 true 并为要丢弃的任何内容抛出 AmqpRejectAndDontRequeueRejected .

    您可以将所需的逻辑封装在 ErrorHandler 中 .

    默认错误处理程序与特定的异常列表完全相同,因为documented here - 您可以注入自定义 FatalExceptionStrategy .

    但对于条件拒绝, defaultRequeueRejected 必须是 true .

    EDIT

    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() {...} .

相关问题