Spring AMQP и RetryTemplate - PullRequest
       6

Spring AMQP и RetryTemplate

0 голосов
/ 06 марта 2019

У меня есть RabbitTemplate, настроенный с RetryTemplate следующим образом:

@Bean 
public RabbitTemplate myRabbitTemplate() 
{
        RabbitTemplate template = new RabbitTemplate(myConnectionFactory());
        template.setChannelTransacted(true);

        template.setMessageConverter(myMessageConverter());
        template.setReplyAddress(MY_RESPONSE_PRIVATE_QUEUE);
        template.setQueue(MY_RESPONSE_PRIVATE_QUEUE);
        template.setMandatory(true);
        template.setEncoding("UTF-8");
        template.setExchange(MY_REQUEST_EXCHANGE);
        template.setBeforePublishPostProcessors(new MyMessagePostProcessor());

        RetryTemplate retryTemplate = new RetryTemplate();
        ExponentialBackOffPolicy backOffPolicy = new ExponentialBackOffPolicy();
        backOffPolicy.setInitialInterval(500);
        backOffPolicy.setMultiplier(10.0);
        backOffPolicy.setMaxInterval(10000);
        retryTemplate.setBackOffPolicy(backOffPolicy);
        template.setRetryTemplate(retryTemplate);
        template.setAfterReceivePostProcessors(new DelegatingDecompressingPostProcessor());

        return template;
}

Выполняя тесты соединения с использованием TCPView и WireShark, я думаю, что при одном из разрывов соединения одно из отправленных сообщений было продублировано (я предполагаю, что конфигурация RetryTemplate).

На протяжении всего проекта были другие сбои и ошибки соединения (ShutdownSignalException, TimeOut ...), и мы никогда не обнаруживали дубликаты сообщений. При каких обстоятельствах повторная попытка отправки сообщения?

Спасибо

РЕДАКТИРОВАТЬ 11/03/2019

Теперь у меня есть немного больше информации о повторяющихся сообщениях. Во время отправки сообщения (и до получения ACK) произошла ошибка соединения:

06-03-2019 10:09:52.919|WARN |com.rabbitmq.client.impl.ForgivingExceptionHandler|120||AMQP Connection XXX.XX.XX.XX:XXXXX|An unexpected connection driver error occured (Exception message: Connection reset)

com.rabbitmq.client.ShutdownSignalException: connection error
    at com.rabbitmq.client.impl.AMQConnection.startShutdown(AMQConnection.java:868)
    at com.rabbitmq.client.impl.AMQConnection.shutdown(AMQConnection.java:858)
    at com.rabbitmq.client.impl.AMQConnection.handleFailure(AMQConnection.java:681)
    at com.rabbitmq.client.impl.AMQConnection.access$400(AMQConnection.java:47)
    at com.rabbitmq.client.impl.AMQConnection$MainLoop.run(AMQConnection.java:582)
    at java.lang.Thread.run(Thread.java:748)
Caused by: java.net.SocketException: Connection reset
    at java.net.SocketInputStream.read(SocketInputStream.java:210)
    at java.net.SocketInputStream.read(SocketInputStream.java:141)

Сервер получает два сообщения с одной и той же spring_listener_return_correlation, но разной spring_request_return_correlation:

spring_listener_return_correlation=0475d6f3-4859-418d-93fe-ed96fb28e733, spring_request_return_correlation=2926

spring_listener_return_correlation=0475d6f3-4859-418d-93fe-ed96fb28e733, spring_request_return_correlation=2927

Может ли конфигурация «RetryTemplate» быть причиной этой двойной отправки?

Спасибо

...