1

経験豊富な Camel ユーザーの皆さん!教えてください

1) 一般的に、設計のどこが間違っていますか? (最適ではないことは確かです)

2) Exchange 本体で POJO を使用する正しい方法は何ですか?

私の Grails Web アプリケーションは、いくつかの中間ステップでリモート Web サービスと対話する必要があります。

  1. リクエストxmlを作成
  2. この xml を検証する
  3. xml に dsig で署名する
  4. 署名済み xml をこの Web サービスに送信する
  5. 応答署名の検証
  6. 応答 XML を検証する
  7. プロセス応答

各ステップで例外がスローされる場合があり、これはページに表示する必要があります。次のように: 「ステップ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" です。

4

0 に答える 0