From 7751dbc141dc160edb6941fa4eac1abcecaa7d98 Mon Sep 17 00:00:00 2001 From: Johan Kaving Date: Tue, 4 Feb 2025 22:54:46 +0100 Subject: [PATCH] GH-2949: Fix retryCount handling in the `DefaultMessagePropertiesConverter` Fixes: #2949 Issue link: 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 [artem.bilan@broadcom.com improve commit message] Signed-off-by: Artem Bilan (cherry picked from commit f621b86b7825f5548b45215696e7bb6bf910b057) --- .../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 2a9bf33f..f9f4d9cf 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 @@ import org.springframework.util.StringUtils; * @author Raylax Grey * @author Artem Bilan * @author Ngoc Nhan + * @author Johan Kaving * * @since 1.0 */ @@ -155,11 +156,7 @@ public class DefaultMessagePropertiesConverter implements MessagePropertiesConve @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 class DefaultMessagePropertiesConverter implements MessagePropertiesConve 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 37545297..91ce1189 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 @@ import static org.assertj.core.api.Assertions.assertThat; /** * @author Soeren Unruh * @author Gary Russell + * @author Johan Kaving * @since 1.3 */ public class DefaultMessagePropertiesConverterTests { @@ -200,6 +201,17 @@ public class DefaultMessagePropertiesConverterTests { 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() {