Negative Acknowledgement to RabbitMQ Queue to Re-Queue the Message using Spring AMQP

﹥>﹥吖頭↗ 提交于 2019-12-12 01:56:26

问题


I have an application which uses spring AMQP for consuming and producing messages to other application. I have a scenario where some of the exception occurred i need to re-queue back to RabbitMQ. For some exceptions i need to ignore (Basically i need to ignore the message no need to requeue)

Currently in below code, i have set the configuration as

factory.setDefaultRequeueRejected(false);

But my requirement is to dynamically reject for some messages and re-queue back to RabbitMQ for some messages.

Please suggest

@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:


You can't do it that way around (default false).

To do it selectively you have to set defaultRequeueRejected to true and throw AmqpRejectAndDontRequeueRejected for any you want discarded.

You can encapsulate your desired logic in an ErrorHandler.

The default error handler does exactly that for a certain list of exceptions, as documented here - you can inject a custom FatalExceptionStrategy.

But for conditional rejection, the defaultRequeueRejected must be 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;
    }));

This adds MyBadXMLException to the standard list.

If you are not using Java 8, use new FatalExceptionStrategy() {...}.



来源:https://stackoverflow.com/questions/39509745/negative-acknowledgement-to-rabbitmq-queue-to-re-queue-the-message-using-spring

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!