ルートの最後でリクエストメッセージとレスポンスメッセージの両方を処理したいと思います。ただし、元のリクエストメッセージにアクセスする方法がわかりません。
私はいくつかの基本的な概念に苦労しているというひどい気持ちを持っています。
これが私の問題の概要を説明するDSLの簡単なルート例です(streamCachingはコンテキスト全体で有効になっています):
from("activemq:queue:myQueue")
.to("log:" + getClass().getName() + "?showOut=true")
.to("http://localhost:8080/someBackend")
.log("Now in.Body returns this: ${in.body} and out.Body this: ${out.body}")
.to("log:" + getClass().getName() + "?showOut=true");
これが私のログからの抜粋です(読みやすくするために改行を編集しました)。ご覧のとおり、httpサーバーが応答すると元のSOAPメッセージは失われ、SOAP応答オブジェクトはメッセージのinBodyに格納されます。
2012-09-25 17:28:08,312 local.bar.foo.MyRouteBuilder INFO -
Exchange[ExchangePattern:InOut, BodyType:byte[],
Body:<?xml version="1.0" encoding="UTF-8"?><env:Envelope xmlns:env="http://schemas.xmlsoap.org/soap/envelope/"><env:Header /><env:Body><urn:someRequest xmlns:urn="http://foo.bar.local/ns"></urn:someRequest></env:Body></env:Envelope>,
Out: null]
2012-09-25 17:28:08,398 org.apache.camel.component.http.HttpProducer DEBUG -
Executing http POST method: http://localhost:8080/someBackend
2012-09-25 17:28:09,389 org.apache.camel.component.http.HttpProducer DEBUG -
Http responseCode: 200
2012-09-25 17:28:09,392 route2 INFO -
Now in.Body returns this: <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"><soap:Body><ns2:someResponse xmlns:ns2="http://foo.bar.local/ns"</ns2:someResponse></soap:Body></soap:Envelope>
and out.Body this:
2012-09-25 17:28:09,392 local.bar.foo.MyRouteBuilder INFO -
Exchange[ExchangePattern:InOut,
BodyType:org.apache.camel.converter.stream.InputStreamCache,
Body:[Body is instance of org.apache.camel.StreamCache],
Out: null]
ルート全体でin.bodyとout.bodyが保持されることを期待していましたか?
私が検討している代替ソリューション:
- 相関識別子パターンを使用して、要求と応答の両方を相関させます。しかし、これはメッセージ本文も保持しますか?また、私のリクエスト/リプライメッセージには、相関のための一意の識別子がありません。
- httpバックエンドへの呼び出しを実行し、要求オブジェクトと応答オブジェクトの両方を処理するカスタムBeanを記述します(ただし、これは基本的にCamelを使用しないソリューションであり、車輪の再発明であるため、推奨されません)
すでに失敗したアプローチ:
ルートの最後に次のようなプロセッサを使用して元の要求メッセージにアクセスしようとしましたが、成功しませんでした。
process(new Processor() {
@Override
public void process(Exchange exchange) throws Exception {
Message originalInMessage = exchange.getUnitOfWork().getOriginalInMessage();
logger.debug(originalInMessage.getBody(String.class));
logger.debug(exchange.getIn().getBody(String.class));
}
});
助けてくれてありがとう