Spring AMQP recoverer не работает с SimpleMessageListenerContainer - PullRequest
1 голос
/ 22 января 2020

Я пытаюсь осуществить восстановление весной amqp. Я использовал приведенный ниже код для реализации того же

RetryOperationsInterceptor retryInterceptorBuilder =RetryInterceptorBuilder.stateless()
                .maxAttempts(5)
                .recoverer(new CustomRejectAndDontRequeueRecoverer())
                .build();

container.setAdviceChain(new RetryOperationsInterceptor[]{retryInterceptorBuilder});

Вышеуказанный контейнер является экземпляром SimpleMessageListenerContainer. Теперь в один из моих приемников я кидаю ClassCastException.

public class CustomRejectAndDontRequeueRecoverer implements MessageRecoverer {


    private static Logger logger = //created some logger instance.

    //Overriding the method to do custom task when the retries are exhausted, like insert in database.
    @Override
    public void recover(Message message, Throwable cause) {
        logger.error("The recovery method is called","","");
        throw new RuntimeException(cause);
    }

}

Пожалуйста, направьте меня в правильном направлении.

Обновление:

В моем CustomMessagingPostProcessor выдается некоторое исключение. Мой RetryOperationsInterceptor повторяет сообщения только в том случае, если исключение выдается в методе onMessage (). Добавление определения CustomMessagingPostProcessor: -

public class MTMessagingPostProcessor implements MessagePostProcessor{



    /**
     * {@inheritDoc}
     */
    @Override
    public Message postProcessMessage(Message message) {
        logger.xdebug("Inside MTMessagingPostProcessor", 

          //Throwing exception to show that some exception can be thrown in original code and I want to requeue messages to come here for n number of times.
            throw new RuntimeException("TEST");
        //return message;
    }


    public void setTenantProvider(TenantProvider tenantProvider) {
        this.tenantProvider = tenantProvider;
    }


}

Я хочу запрашивать сообщения n раз, если в MTMessagingPostProcessor генерируется исключение, это не достигается перехватчиком, поскольку он повторяет сообщения в методе onMessage () слушателя.

1 Ответ

1 голос
/ 24 января 2020

Если вы имеете в виду, что вы предоставляете MessagePostProcessor в свойстве контейнера afterReceiveMessagePostProcessors, эти постпроцессоры вызываются вне области цепочки рекомендаций (повторные перехватчики).

Вы не можете "повторить попытку "исключения, выдаваемые такими постпроцессорами.

Перехватчик повторных попыток применяется только к самому слушателю.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...