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`**
This commit is contained in:
Artem Bilan
2022-07-18 15:27:15 -04:00
committed by Gary Russell
parent 19b466809d
commit f92a37786b
2 changed files with 21 additions and 7 deletions

View File

@@ -107,10 +107,17 @@ public final class MessageHistory implements List<Properties>, 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<T>) errorMessage;
}
else if (message instanceof AdviceMessage) {

View File

@@ -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<String> original = new GenericMessage<String>("foo");
GenericMessage<String> original = new GenericMessage<>("foo");
assertThat(MessageHistory.read(original)).isNull();
Message<String> 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<Throwable> 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;
}
}
}