Skip to content

Commit

Permalink
GH-3843: propagate ErrorMessage.originalMes in MH
Browse files Browse the repository at this point in the history
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`**
  • Loading branch information
artembilan authored and garyrussell committed Jul 18, 2022
1 parent 8f44870 commit 92630dd
Show file tree
Hide file tree
Showing 2 changed files with 21 additions and 7 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -107,10 +107,17 @@ public static <T> Message<T> write(Message<T> messageArg, NamedComponent compone
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) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -34,13 +35,14 @@
/**
* @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);
Expand All @@ -52,11 +54,12 @@ public void addComponents() {
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
Expand All @@ -78,13 +81,15 @@ public void testCorrectMutableMessageAfterWrite() {

@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");
Expand All @@ -93,6 +98,7 @@ public void testCorrectErrorMessageAfterWrite() {
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");
Expand Down Expand Up @@ -140,6 +146,7 @@ public String getComponentName() {
public String getComponentType() {
return "type-" + this.id;
}

}

}

0 comments on commit 92630dd

Please sign in to comment.