У меня есть 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» быть причиной этой двойной отправки?
Спасибо