From 22edff0bbf7f1e6df995b40e47cdccba51f8ab4c Mon Sep 17 00:00:00 2001 From: Rujun Chen Date: Mon, 29 Jun 2026 10:45:40 +0800 Subject: [PATCH] Fix DLQ reason/description handling in Service Bus binder - remove redundant no-arg deadLetter() call so DeadLetterOptions is applied - strengthen regression test to guard against extra settlement interactions - update spring changelog for issue #41883 Co-authored-by: sunghyun1999 <32184099@dankook.ac.kr> --- sdk/spring/CHANGELOG.md | 8 ++++++++ .../implementation/ServiceBusMessageChannelBinder.java | 1 - .../ServiceBusMessageChannelBinderTest.java | 4 ++++ 3 files changed, 12 insertions(+), 1 deletion(-) diff --git a/sdk/spring/CHANGELOG.md b/sdk/spring/CHANGELOG.md index bb90663486a1..ca0622efd74d 100644 --- a/sdk/spring/CHANGELOG.md +++ b/sdk/spring/CHANGELOG.md @@ -93,6 +93,14 @@ This section includes changes in `spring-cloud-azure-docker-compose` module. - Upgrade to Jackson 3 to align with Spring Boot 4 ([#49538](https://github.com/Azure/azure-sdk-for-java/issues/49538)). +### Spring Cloud Azure Stream Binder Service Bus + +This section includes changes in `spring-cloud-azure-stream-binder-servicebus` module. + +#### Bugs Fixed + +- Fixed a regression where dead-letter reason and error description were not transmitted because a no-arg `deadLetter()` call settled the message before `deadLetter(options)` was invoked ([#41883](https://github.com/Azure/azure-sdk-for-java/issues/41883)). + ## 6.4.0 (2026-06-01) - This release is compatible with Spring Boot 3.5.0-3.5.14. (Note: 3.5.x (x>14) should be supported, but they aren't tested with this release.) - This release is compatible with Spring Cloud 2025.0.0-2025.0.2. (Note: 2025.0.x (x>2) should be supported, but they aren't tested with this release.) diff --git a/sdk/spring/spring-cloud-azure-stream-binder-servicebus/src/main/java/com/azure/spring/cloud/stream/binder/servicebus/implementation/ServiceBusMessageChannelBinder.java b/sdk/spring/spring-cloud-azure-stream-binder-servicebus/src/main/java/com/azure/spring/cloud/stream/binder/servicebus/implementation/ServiceBusMessageChannelBinder.java index e25751160363..25cff61e2702 100644 --- a/sdk/spring/spring-cloud-azure-stream-binder-servicebus/src/main/java/com/azure/spring/cloud/stream/binder/servicebus/implementation/ServiceBusMessageChannelBinder.java +++ b/sdk/spring/spring-cloud-azure-stream-binder-servicebus/src/main/java/com/azure/spring/cloud/stream/binder/servicebus/implementation/ServiceBusMessageChannelBinder.java @@ -227,7 +227,6 @@ public void deadLetter(String destination, .getHeaders() .get(ServiceBusMessageHeaders.RECEIVED_MESSAGE_CONTEXT); if (messageContext != null) { - messageContext.deadLetter(); DeadLetterOptions options = new DeadLetterOptions(); options.setDeadLetterReason(deadLetterReason); options.setDeadLetterErrorDescription(deadLetterErrorDescription); diff --git a/sdk/spring/spring-cloud-azure-stream-binder-servicebus/src/test/java/com/azure/spring/cloud/stream/binder/servicebus/implementation/ServiceBusMessageChannelBinderTest.java b/sdk/spring/spring-cloud-azure-stream-binder-servicebus/src/test/java/com/azure/spring/cloud/stream/binder/servicebus/implementation/ServiceBusMessageChannelBinderTest.java index 749e16e2329b..ad27f9960420 100644 --- a/sdk/spring/spring-cloud-azure-stream-binder-servicebus/src/test/java/com/azure/spring/cloud/stream/binder/servicebus/implementation/ServiceBusMessageChannelBinderTest.java +++ b/sdk/spring/spring-cloud-azure-stream-binder-servicebus/src/test/java/com/azure/spring/cloud/stream/binder/servicebus/implementation/ServiceBusMessageChannelBinderTest.java @@ -34,7 +34,9 @@ import static org.assertj.core.api.Assertions.assertThat; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.never; import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.verifyNoMoreInteractions; import static org.mockito.Mockito.when; class ServiceBusMessageChannelBinderTest { @@ -104,9 +106,11 @@ void testDeadLetterCalledForError() { String description = "testDescription"; ErrorMessage msg = new ErrorMessage(new RuntimeException(description), originalMessage); handler.handleMessage(msg); + verify(messageContext, never()).deadLetter(); verify(messageContext).deadLetter(captor.capture()); assertEquals("exception-message", captor.getValue().getDeadLetterReason()); assertEquals(description, captor.getValue().getDeadLetterErrorDescription()); + verifyNoMoreInteractions(messageContext); } @Test