経験豊富な Camel ユーザーの皆さん!教えてください
1) 一般的に、設計のどこが間違っていますか? (最適ではないことは確かです)
2) Exchange 本体で POJO を使用する正しい方法は何ですか?
私の Grails Web アプリケーションは、いくつかの中間ステップでリモート Web サービスと対話する必要があります。
- リクエストxmlを作成
- この xml を検証する
- xml に dsig で署名する
- 署名済み xml をこの Web サービスに送信する
- 応答署名の検証
- 応答 XML を検証する
- プロセス応答
各ステップで例外がスローされる場合があり、これはページに表示する必要があります。次のように: 「ステップStepNameでエラーが発生しました。エラー メッセージ:メッセージ」。
したがって、私の好ましいパターンは「Request-Reply」だと思います。
一連のプロセッサを使用してキャメル ルートを組み立てようとしています。各プロセッサは、このように .doTry() でラップされます。
from("direct:sendServiceCatalog")
.doTry()
.process(new Processor() {
@Override
public void process(Exchange arg0) throws Exception {
System.out.println("PROCESSING");
throw new RuntimeException("Nice try");
}
})
.to("mock:result")
.doCatch(Exception.class)
.process(
new ExceptionStageDetectorProcessor(
SendServiceCatalogStage.FORM_XML))
.to("mock:catch")
.end();
ExceptionStageDetectorProcessor.java クラスは非常に単純です。
public class ExceptionStageDetectorProcessor implements Processor {
public ExceptionStageDetectorProcessor(SendServiceCatalogStage stage) {
this.stage = stage;
}
public SendServiceCatalogStage getStage() {
return stage;
}
private SendServiceCatalogStage stage;
@Override
public void process(Exchange exchange) throws Exception {
Throwable caughtException = (Throwable) exchange
.getProperty(Exchange.EXCEPTION_CAUGHT);
exchange.getOut().setBody(new ProcessError(stage, caughtException));
}
}
ほとんど効きました!:)
問題は、新しい本体ProcessErrorを使用できないことです。例外が発生した場合、返されるオブジェクトは ProcessError オブジェクトではなくエラー文字列です。単純な文字列 .setBody("FOO") を設定しようとすると、返されるオブジェクトは正確に "FOO" です。