From f92a37786bf4426f890ae8ae2bdd5fdbd453a425 Mon Sep 17 00:00:00 2001 From: Artem Bilan Date: Mon, 18 Jul 2022 15:27:15 -0400 Subject: [PATCH] GH-3843: propagate ErrorMessage.originalMes in MH Fixes https://github.com/spring-projects/spring-integration/issues/3843 The `MessageHistory.write()` is missing the `ErrorMessage.originalMessage` on creating a new `ErrorMessage` with message history header * Reuse an `ErrorMessage.originalMessage` for newly created `ErrorMessage` after populating the message history header **Cherry-pick to `5.5.x`** --- .../integration/history/MessageHistory.java | 11 +++++++++-- .../integration/core/MessageHistoryTests.java | 17 ++++++++++++----- 2 files changed, 21 insertions(+), 7 deletions(-) diff --git a/spring-integration-core/src/main/java/org/springframework/integration/history/MessageHistory.java b/spring-integration-core/src/main/java/org/springframework/integration/history/MessageHistory.java index fb54d20ce0..f3fc16dcfe 100644 --- a/spring-integration-core/src/main/java/org/springframework/integration/history/MessageHistory.java +++ b/spring-integration-core/src/main/java/org/springframework/integration/history/MessageHistory.java @@ -107,10 +107,17 @@ public final class MessageHistory implements List, Serializable { message.getHeaders().put(HEADER_NAME, history); } else if (message instanceof ErrorMessage) { + ErrorMessage errorMessage = (ErrorMessage) message; IntegrationMessageHeaderAccessor headerAccessor = new IntegrationMessageHeaderAccessor(message); headerAccessor.setHeader(HEADER_NAME, history); - Throwable payload = ((ErrorMessage) message).getPayload(); - ErrorMessage errorMessage = new ErrorMessage(payload, headerAccessor.toMessageHeaders()); + Throwable payload = errorMessage.getPayload(); + Message originalMessage = errorMessage.getOriginalMessage(); + if (originalMessage != null) { + errorMessage = new ErrorMessage(payload, headerAccessor.toMessageHeaders(), originalMessage); + } + else { + errorMessage = new ErrorMessage(payload, headerAccessor.toMessageHeaders()); + } message = (Message) errorMessage; } else if (message instanceof AdviceMessage) { diff --git a/spring-integration-core/src/test/java/org/springframework/integration/core/MessageHistoryTests.java b/spring-integration-core/src/test/java/org/springframework/integration/core/MessageHistoryTests.java index ac50334866..2ebf7ab044 100644 --- a/spring-integration-core/src/test/java/org/springframework/integration/core/MessageHistoryTests.java +++ b/spring-integration-core/src/test/java/org/springframework/integration/core/MessageHistoryTests.java @@ -17,10 +17,11 @@ package org.springframework.integration.core; import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatExceptionOfType; import java.util.Properties; -import org.junit.Test; +import org.junit.jupiter.api.Test; import org.springframework.integration.history.MessageHistory; import org.springframework.integration.message.AdviceMessage; @@ -34,13 +35,14 @@ import org.springframework.messaging.support.GenericMessage; /** * @author Mark Fisher * @author Artem Bilan + * * @since 2.0 */ public class MessageHistoryTests { @Test public void addComponents() { - GenericMessage original = new GenericMessage("foo"); + GenericMessage original = new GenericMessage<>("foo"); assertThat(MessageHistory.read(original)).isNull(); Message result1 = MessageHistory.write(original, new TestComponent(1)); MessageHistory history1 = MessageHistory.read(result1); @@ -52,11 +54,12 @@ public class MessageHistoryTests { assertThat(history2.toString()).isEqualTo("testComponent-1,testComponent-2"); } - @Test(expected = UnsupportedOperationException.class) + @Test public void verifyImmutability() { Message message = MessageHistory.write(MessageBuilder.withPayload("test").build(), new TestComponent(1)); MessageHistory history = MessageHistory.read(message); - history.add(new Properties()); + assertThatExceptionOfType(UnsupportedOperationException.class) + .isThrownBy(() -> history.add(new Properties())); } @Test @@ -78,13 +81,15 @@ public class MessageHistoryTests { @Test public void testCorrectErrorMessageAfterWrite() { + Message originalMessage = new GenericMessage<>("test"); RuntimeException payload = new RuntimeException(); - ErrorMessage original = new ErrorMessage(payload); + ErrorMessage original = new ErrorMessage(payload, originalMessage); assertThat(MessageHistory.read(original)).isNull(); Message result1 = MessageHistory.write(original, new TestComponent(1)); assertThat(result1).isInstanceOf(ErrorMessage.class); assertThat(result1).isNotSameAs(original); assertThat(result1.getPayload()).isSameAs(original.getPayload()); + assertThat(result1).extracting("originalMessage").isSameAs(originalMessage); MessageHistory history1 = MessageHistory.read(result1); assertThat(history1).isNotNull(); assertThat(history1.toString()).isEqualTo("testComponent-1"); @@ -93,6 +98,7 @@ public class MessageHistoryTests { assertThat(result2).isNotSameAs(original); assertThat(result2).isNotSameAs(result1); assertThat(result2.getPayload()).isSameAs(original.getPayload()); + assertThat(result1).extracting("originalMessage").isSameAs(originalMessage); MessageHistory history2 = MessageHistory.read(result2); assertThat(history2).isNotNull(); assertThat(history2.toString()).isEqualTo("testComponent-1,testComponent-2"); @@ -140,6 +146,7 @@ public class MessageHistoryTests { public String getComponentType() { return "type-" + this.id; } + } }