From aa5742e0dd770863cd4af88576a8241ab6b1992f Mon Sep 17 00:00:00 2001 From: Johan Kaving Date: Tue, 4 Feb 2025 22:37:10 +0100 Subject: [PATCH] GH-2949: Fix retryCount handling Fixes https://github.com/spring-projects/spring-amqp/issues/2949 The handling of retryCount is moved into convertHeadersIfNecessary(), so that we can still return a Collections.emptyMap() if there are no headers in the source MessageProperties and no retryCount to add. Signed-off-by: Johan Kaving --- .../DefaultMessagePropertiesConverter.java | 17 ++++++++++------- .../DefaultMessagePropertiesConverterTests.java | 12 ++++++++++++ 2 files changed, 22 insertions(+), 7 deletions(-) diff --git a/spring-rabbit/src/main/java/org/springframework/amqp/rabbit/support/DefaultMessagePropertiesConverter.java b/spring-rabbit/src/main/java/org/springframework/amqp/rabbit/support/DefaultMessagePropertiesConverter.java index 2a9bf33f7..f9f4d9cf4 100644 --- a/spring-rabbit/src/main/java/org/springframework/amqp/rabbit/support/DefaultMessagePropertiesConverter.java +++ b/spring-rabbit/src/main/java/org/springframework/amqp/rabbit/support/DefaultMessagePropertiesConverter.java @@ -43,6 +43,7 @@ * @author Raylax Grey * @author Artem Bilan * @author Ngoc Nhan + * @author Johan Kaving * * @since 1.0 */ @@ -155,11 +156,7 @@ else if (MessageProperties.RETRY_COUNT.equals(key)) { @Override public BasicProperties fromMessageProperties(final MessageProperties source, final String charset) { BasicProperties.Builder target = new BasicProperties.Builder(); - Map headers = convertHeadersIfNecessary(source.getHeaders()); - long retryCount = source.getRetryCount(); - if (retryCount > 0) { - headers.put(MessageProperties.RETRY_COUNT, retryCount); - } + Map headers = convertHeadersIfNecessary(source); target.headers(headers) .timestamp(source.getTimestamp()) .messageId(source.getMessageId()) @@ -186,14 +183,20 @@ public BasicProperties fromMessageProperties(final MessageProperties source, fin return target.build(); } - private Map convertHeadersIfNecessary(Map headers) { - if (CollectionUtils.isEmpty(headers)) { + private Map convertHeadersIfNecessary(MessageProperties source) { + Map headers = source.getHeaders(); + long retryCount = source.getRetryCount(); + + if (CollectionUtils.isEmpty(headers) && retryCount == 0) { return Collections.emptyMap(); } Map writableHeaders = new HashMap<>(); for (Map.Entry entry : headers.entrySet()) { writableHeaders.put(entry.getKey(), this.convertHeaderValueIfNecessary(entry.getValue())); } + if (retryCount > 0) { + writableHeaders.put(MessageProperties.RETRY_COUNT, retryCount); + } return writableHeaders; } diff --git a/spring-rabbit/src/test/java/org/springframework/amqp/rabbit/support/DefaultMessagePropertiesConverterTests.java b/spring-rabbit/src/test/java/org/springframework/amqp/rabbit/support/DefaultMessagePropertiesConverterTests.java index 375452971..91ce11892 100644 --- a/spring-rabbit/src/test/java/org/springframework/amqp/rabbit/support/DefaultMessagePropertiesConverterTests.java +++ b/spring-rabbit/src/test/java/org/springframework/amqp/rabbit/support/DefaultMessagePropertiesConverterTests.java @@ -38,6 +38,7 @@ /** * @author Soeren Unruh * @author Gary Russell + * @author Johan Kaving * @since 1.3 */ public class DefaultMessagePropertiesConverterTests { @@ -200,6 +201,17 @@ public void testClassHeader() { assertThat(basic.getHeaders().get("aClass")).isEqualTo(getClass().getName()); } + @Test + public void testRetryCount() { + MessageProperties props = new MessageProperties(); + props.incrementRetryCount(); + BasicProperties basic = new DefaultMessagePropertiesConverter().fromMessageProperties(props, "UTF8"); + assertThat(basic.getHeaders().get(MessageProperties.RETRY_COUNT)).isEqualTo(1L); + props.incrementRetryCount(); + basic = new DefaultMessagePropertiesConverter().fromMessageProperties(props, "UTF8"); + assertThat(basic.getHeaders().get(MessageProperties.RETRY_COUNT)).isEqualTo(2L); + } + private static class Foo { Foo() {