2つIntegrationFlow
のは次のように定義されています。
@Bean
public IntegrationFlow myFlow() {
return IntegrationFlows.from("input.channel")
.handle("myService", "handle")
.get();
}
@Bean
public IntegrationFlow exceptionFlow() {
return IntegrationFlows.from("error.channel")
.handle(m -> System.out.println(m.getHeaders()))
.get();
}
MyService
の `handle1メソッドのハンドラは、メッセージを出力して例外をスローするだけです。
public class MyService {
public String handle(String s) {
System.out.println(s);
throw new RuntimeException("error");
}
}
テストでは、エラーチャネル値が正確に定義されたメッセージがerror.channel
input.channel channel, and it is expected to route to the
error.channel`チャネルに入れられます。
@Test
public void myTest() {
Message<String> m = MessageBuilder.withPayload("foo").setHeader(MessageHeaders.ERROR_CHANNEL, "error.channel").build();
this.someInputChannel.send(m);
}
ただし、テストで例外がスローされ、メッセージはエラーチャネルにルーティングされません。
これは正しい動作です。errorChannel
スレッド実行部が存在する場合にのみヘッダが参照されます。例外はプレーンJavaで行われるため、呼び出し元にスローされます。以下の場合QueueChannel
とExecutorChannel
があるMessagePublishingErrorHandler
にタスクの呼び出しをラップしているtry..catch
と、送信ErrorMessage
にerrorChannel
ヘッダ。
あなたの場合、それはthis.someInputChannel.send(m);
それを使った単純なJava呼び出しなので、このメインスレッドで直接例外を受け取ります。
詳細については、リファレンスマニュアルをご覧ください:https : //docs.spring.io/spring-integration/docs/current/reference/html/#namespace-errorhandler
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加