Skip to content

Commit f92a377

Browse files
artembilangaryrussell
authored andcommitted
GH-3843: propagate ErrorMessage.originalMes in MH
Fixes #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`**
1 parent 19b4668 commit f92a377

File tree

2 files changed

+21
-7
lines changed

2 files changed

+21
-7
lines changed

spring-integration-core/src/main/java/org/springframework/integration/history/MessageHistory.java

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -107,10 +107,17 @@ public static <T> Message<T> write(Message<T> messageArg, NamedComponent compone
107107
message.getHeaders().put(HEADER_NAME, history);
108108
}
109109
else if (message instanceof ErrorMessage) {
110+
ErrorMessage errorMessage = (ErrorMessage) message;
110111
IntegrationMessageHeaderAccessor headerAccessor = new IntegrationMessageHeaderAccessor(message);
111112
headerAccessor.setHeader(HEADER_NAME, history);
112-
Throwable payload = ((ErrorMessage) message).getPayload();
113-
ErrorMessage errorMessage = new ErrorMessage(payload, headerAccessor.toMessageHeaders());
113+
Throwable payload = errorMessage.getPayload();
114+
Message<?> originalMessage = errorMessage.getOriginalMessage();
115+
if (originalMessage != null) {
116+
errorMessage = new ErrorMessage(payload, headerAccessor.toMessageHeaders(), originalMessage);
117+
}
118+
else {
119+
errorMessage = new ErrorMessage(payload, headerAccessor.toMessageHeaders());
120+
}
114121
message = (Message<T>) errorMessage;
115122
}
116123
else if (message instanceof AdviceMessage) {

spring-integration-core/src/test/java/org/springframework/integration/core/MessageHistoryTests.java

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -17,10 +17,11 @@
1717
package org.springframework.integration.core;
1818

1919
import static org.assertj.core.api.Assertions.assertThat;
20+
import static org.assertj.core.api.Assertions.assertThatExceptionOfType;
2021

2122
import java.util.Properties;
2223

23-
import org.junit.Test;
24+
import org.junit.jupiter.api.Test;
2425

2526
import org.springframework.integration.history.MessageHistory;
2627
import org.springframework.integration.message.AdviceMessage;
@@ -34,13 +35,14 @@
3435
/**
3536
* @author Mark Fisher
3637
* @author Artem Bilan
38+
*
3739
* @since 2.0
3840
*/
3941
public class MessageHistoryTests {
4042

4143
@Test
4244
public void addComponents() {
43-
GenericMessage<String> original = new GenericMessage<String>("foo");
45+
GenericMessage<String> original = new GenericMessage<>("foo");
4446
assertThat(MessageHistory.read(original)).isNull();
4547
Message<String> result1 = MessageHistory.write(original, new TestComponent(1));
4648
MessageHistory history1 = MessageHistory.read(result1);
@@ -52,11 +54,12 @@ public void addComponents() {
5254
assertThat(history2.toString()).isEqualTo("testComponent-1,testComponent-2");
5355
}
5456

55-
@Test(expected = UnsupportedOperationException.class)
57+
@Test
5658
public void verifyImmutability() {
5759
Message<?> message = MessageHistory.write(MessageBuilder.withPayload("test").build(), new TestComponent(1));
5860
MessageHistory history = MessageHistory.read(message);
59-
history.add(new Properties());
61+
assertThatExceptionOfType(UnsupportedOperationException.class)
62+
.isThrownBy(() -> history.add(new Properties()));
6063
}
6164

6265
@Test
@@ -78,13 +81,15 @@ public void testCorrectMutableMessageAfterWrite() {
7881

7982
@Test
8083
public void testCorrectErrorMessageAfterWrite() {
84+
Message<?> originalMessage = new GenericMessage<>("test");
8185
RuntimeException payload = new RuntimeException();
82-
ErrorMessage original = new ErrorMessage(payload);
86+
ErrorMessage original = new ErrorMessage(payload, originalMessage);
8387
assertThat(MessageHistory.read(original)).isNull();
8488
Message<Throwable> result1 = MessageHistory.write(original, new TestComponent(1));
8589
assertThat(result1).isInstanceOf(ErrorMessage.class);
8690
assertThat(result1).isNotSameAs(original);
8791
assertThat(result1.getPayload()).isSameAs(original.getPayload());
92+
assertThat(result1).extracting("originalMessage").isSameAs(originalMessage);
8893
MessageHistory history1 = MessageHistory.read(result1);
8994
assertThat(history1).isNotNull();
9095
assertThat(history1.toString()).isEqualTo("testComponent-1");
@@ -93,6 +98,7 @@ public void testCorrectErrorMessageAfterWrite() {
9398
assertThat(result2).isNotSameAs(original);
9499
assertThat(result2).isNotSameAs(result1);
95100
assertThat(result2.getPayload()).isSameAs(original.getPayload());
101+
assertThat(result1).extracting("originalMessage").isSameAs(originalMessage);
96102
MessageHistory history2 = MessageHistory.read(result2);
97103
assertThat(history2).isNotNull();
98104
assertThat(history2.toString()).isEqualTo("testComponent-1,testComponent-2");
@@ -140,6 +146,7 @@ public String getComponentName() {
140146
public String getComponentType() {
141147
return "type-" + this.id;
142148
}
149+
143150
}
144151

145152
}

0 commit comments

Comments
 (0)