Сообщения Rabbit mQ перемещаются из очереди готовности в очередь распаковки

У меня есть отдельный издатель и потребитель. Я запускаю издателя и публикую сообщения. Теперь я запускаю потребителя, и проблема в том, что сообщения перемещаются из очереди готовности в очередь распаковки, помечая сообщения как повторно доставленные, чего я хочу избежать. Так что я хочу, это должно быть помечен как повторно доставленный, только если я отправлю подтверждение, а не при перезапуске или запуске потребителя

Конфигурация:

@Bean
public org.springframework.amqp.rabbit.connection.Connection mqConnection() {
    CloudFactory cloudFactory = new CloudFactory();
    Cloud cloud = cloudFactory.getCloud();
    return cloud.getServiceConnector("mqservicename", ConnectionFactory.class,
            null).createConnection();
} 
@Bean
public StatefulRetryOperationsInterceptor interceptor() {
        return RetryInterceptorBuilder.stateful().retryOperations(retryTemplate()).recoverer(new RejectAndDontRequeueRecoverer())

            .build();
}
@Bean
public SimpleMessageListenerContainer listenerContainer() {
    SimpleMessageListenerContainer container = new SimpleMessageListenerContainer();
    container.setMessageListener(new MessageListenerAdapter());
    container.setAdviceChain(new Advice[] {
           interceptor()
    });

    return container;
}



@Bean
public RetryTemplate retryTemplate(){
    Map map=new HashMap<Class<? extends Throwable>, Boolean>();
    map.put(CustomException.class, true);
    RetryTemplate retryTemplate=new RetryTemplate();
    retryTemplate.setRetryPolicy(new SimpleRetryPolicy(3,map));
    return retryTemplate;
}

person user    schedule 12.10.2016    source источник
comment
Вы уверены, что подтверждаете сообщения?   -  person cantSleepNow    schedule 12.10.2016
comment
Да, я был. Теперь с комментарием Гэри я отключил его и попробовал с вышеуказанной конфигурацией. Но это дает только 1 попытку, а не 3   -  person user    schedule 14.10.2016


Ответы (1)


Если вы используете Spring AMQP, вам нужно показать свою конфигурацию, когда задаете подобные вопросы.

Если вы установите режим подтверждения в РУЧНОЙ, вы несете ответственность за подтверждение. Прочтите документацию. Для режима подтверждения AUTO контейнер подтвердит сообщение, когда прослушиватель вернется в обычном режиме.

person Gary Russell    schedule 12.10.2016
comment
Я мог бы решить эту проблему, изменив логику повторной доставки в коде. Но теперь проблема заключается в небольшом объеме данных, который я мог бы правильно протестировать, но с большим объемом данных я получаю исключение ниже: - person user; 13.10.2016
comment
org.springframework.amqp.rabbit.connection.CachingConnectionFactory — отключение канала: ошибка канала; метод протокола: #method‹channel.close›(код ответа = 406, текст ответа = PRECONDITION_FAILED - неизвестный тег доставки 123, идентификатор класса = 60, идентификатор метода = 80) - person user; 13.10.2016
comment
Чтобы добавить подробности, я даю сообщению 3 шанса на основе флага повторной доставки. Для каждого сбоя (некоторая логика, которая выполняет некоторую проверку сообщения) я использую basicNack и возвращаю в очередь значение true. При последнем сбое я использую basicknack и перевожу в очередь на false .Для успеха я использую basicAck и перевожу в false. - person user; 13.10.2016
comment
Тег доставки относится к каналу. Вместо того, чтобы пытаться создать собственное решение, вы можете использовать перехватчик повторных попыток с отслеживанием состояния (описано здесь) с режимом AUTO ack, настройте его с помощью RejectAndDontRequeueRecoverer, и он будет делать именно то, что вам нужно. - person Gary Russell; 13.10.2016
comment
Я добавил конфигурацию. SimpleMessageListenerContainer заставляет установить connectionfactory. Я попытался использовать метод AbstractCloudConfig, но он не позволил. Без использования SimpleMessageListenerContainer выполняется только одна повторная попытка. Я обнаружил, что повторная попытка выполняется на основе некоторых правил, установленных rabbitmq, но я хочу повторять попытку всякий раз, когда некоторая логика проверки в моем коде для сообщения терпит неудачу, т. е. повторяет попытку по пользовательскому условию. Итак, с учетом вышеизложенного, как RabbitMQ узнает, что он должен повторить попытку для сообщения, поскольку я установил для autoack значение true в channel.basicConsume ()? Обратите внимание Я использую службу облачного литейного производства для rabbitmq. - person user; 14.10.2016
comment
Вам необходимо настроить политику повторных попыток, чтобы указать, какие исключения следует повторять, а какие нет. См. этот ответ для пример. - person Gary Russell; 14.10.2016