2

Camel を使用して一種のトリガー EIP を実装したいと考えています。

私が欲しいのはこれです: 私はラクダルートのエンドポイントとして機能する Web サービスを持っています。このサービスはリクエストを受信し、リクエストが整形式である場合は、2 つのことを並行して実行する必要があります: 単純なメッセージ「OK」または「ACK」で元の送信者に応答を返すか、またはリクエストが整形式でない場合応答は "NOK" または "RPT" (メッセージの繰り返しを要求) になります。同時に、メッセージが適切な形式である場合は、元のメッセージを情報で強化し、結果のメッセージを送信する別の Web サービスに送信する必要があります (または Exchange、ここでの正しい用語はわかりません)。 ) JMS 実装に。

私のエンドポイントはプロセスのトリガーとして機能しますが、呼び出し元にすぐに応答を返す必要があります。

私の質問は、これを行うためにどのコンポーネントを使用できますか? Spring DSL でルートを実装しています。私は使用して始めました:

<route>
  <from uri="cxf:bean:clientEventEip?dataFormat=MESSAGE"/>
  <multicast>
    <to uri="bean:messageResponse"/><!-- checks the message and returns 'OK' -->
    <to uri="bean:messageEnricher"/><!-- Enriches and sends msg to another WS -->
  </multicast>
</route>

しかし、クライアントでエラー応答が返されます:

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
   <soap:Body>
      <soap:Fault>
         <faultcode>soap:Server</faultcode>
         <faultstring>Exception occurred during execution on the exchange: Exchange[Message: [Body is instance of java.io.InputStream]]</faultstring>
      </soap:Fault>
   </soap:Body>
</soap:Envelope>

そしてIDEでは、次のような多くの例外があります:

org.apache.camel.CamelExecutionException

 org.apache.camel.InvalidPayloadException: No body available of type: org.w3c.dom.Document but has value: org.apache.cxf.transport.http.AbstractHTTPDestination$1@b8c6fb of type: null on: Message: [Body is instance of java.io.InputStream]. Caused by: Error during type conversion from type: null to the required type: org.w3c.dom.Document with value org.apache.cxf.transport.http.AbstractHTTPDestination$1@b8c6fb due org.xml.sax.SAXParseException; lineNumber: 1; columnNumber: 1; Premature end of file.. Exchange[Message: [Body is instance of java.io.InputStream]]. Caused by: [org.apache.camel.TypeConversionException - Error during type conversion from type: null to the required type: org.w3c.dom.Document with value org.apache.cxf.transport.http.AbstractHTTPDestination$1@b8c6fb due org.xml.sax.SAXParseException; lineNumber: 1; columnNumber: 1; Premature end of file.]

camel ルートで Bean の 1 つだけを使用すると、すべてがうまくいき、期待どおりの応答が得られます。

それは私の間違いだと確信しています。間違ったコンポーネントを使用しているに違いありませんが、これを解決する方法がまだわかりません。誰かが私にできる助けに感謝します!

4

1 に答える 1

1

Camel が提供する Wiretap パターンを調べましたか?

http://camel.apache.org/wire-tap.html

盗聴は基本的に、交換のコピーを取得し、別のエンドポイントに非同期的にルーティングします。上記のリンクに詳細があります。

メッセージを確認して問題がなければ、盗聴エンドポイントと応答エンドポイントの両方を呼び出すことができます。このようなもの:

<route>
  <from uri="cxf:bean:clientEventEip?dataFormat=MESSAGE"/>

    <wireTap uri="direct:tap"/>      

    <to uri="bean:messageResponse"/><!-- checks the message and returns 'OK' or 'NOK'-->

</route>

<route>
   <from uri="direct:enrichingRoute"/>
   <to uri="bean:messageEnricher"/><!-- Enriches and sends msg to another WS -->
</route>

おそらく、盗聴を呼び出す前にエラーをチェックするためにフィルターを追加する必要がありますが、wireTap EIP は正しい方向を示しているはずです。

乾杯、ヨゲシュ

于 2012-12-12T04:23:27.560 に答える