0

SOAP サービスを提供する Apache Camel アプリケーションがあります。「初期ルート」は、Apache CFX が提供するエンドポイントから開始します。

メッセージの処理が「速すぎる」のを防ぐための単純なメカニズムが必要です (そして、大規模なスケーラビリティのニーズはありません)。

したがって、私たちはThrottlerを試すことになりました。さて、問題は、ルートにスロットルを追加した後、何かがうまくいかないことです。

最初のルートは、いくらかクリーンアップされています:

from("cxf:bean:sapEndpoint").routeId(SOAP_ENDPOINT)
    .throttle(1)
    .onException(Exception.class)
        .to("direct:emailFaultNotification").handled(false)
    .end()
    .transacted(joinJpaTx)
    .to(xsltRemoveEmptyElements) // Cleaning done with XSLT endpoint
    .to("direct:inboundWorkOrderXml"); // Forward to actual processing

// direct:inboundWorkOrderXml contains various validation, persistance & response

ログのエラー:

2013-02-18 16:50:16,257 [tp1636587648-50] ERROR DefaultErrorHandler            - Failed delivery for exchangeId: ID-...-4. Exhausted after delivery attempt: 1 caught: javax.xml.transform.TransformerException: javax.xml.transform.TransformerException: com.sun.org.apache.xml.internal.utils.WrappedRuntimeException: Content is not allowed in prolog.
javax.xml.transform.TransformerException: javax.xml.transform.TransformerException: com.sun.org.apache.xml.internal.utils.WrappedRuntimeException: Content is not allowed in prolog.
    at com.sun.org.apache.xalan.internal.xsltc.trax.TransformerImpl.transform(TransformerImpl.java:735)[:1.6.0_37]
    at com.sun.org.apache.xalan.internal.xsltc.trax.TransformerImpl.transform(TransformerImpl.java:336)[:1.6.0_37]
    at org.apache.camel.builder.xml.XsltBuilder.process(XsltBuilder.java:98)[camel-core-2.7.0.jar:2.7.0]
    at org.apache.camel.impl.ProcessorEndpoint.onExchange(ProcessorEndpoint.java:102)[camel-core-2.7.0.jar:2.7.0]
    at org.apache.camel.impl.ProcessorEndpoint$1.process(ProcessorEndpoint.java:72)[camel-core-2.7.0.jar:2.7.0]
    ...

そのスロットルは思った通りに動かないと思います。

スロットリングを有効にすると、XSLT エンドポイントが空または無効な XML を受信するように見えますか? スロットル定義がなければ、すべて正常に動作します。少し試してみると、メッセージ本文にはまだ XML 文字列が含まれているように見えますか?

いくつかのアイデア?

4

2 に答える 2

1

再配信に Camel エラー処理を使用する場合は、ストリーミング ペイロードに注意してください。ストリーム キャッシングについては、http: //camel.apache.org/stream-caching.htmlを参照してください。

Camel CXF のドキュメンテーション ページ ( http://camel.apache.org/cxf ) の上部にもヒントがあります。

于 2013-02-18T17:06:26.740 に答える
0

最後に、解決策は私が思っていたよりも単純でした。「cxf:bean:s​​apEndpoint」から始まるルートでスロットルを使用する代わりに、ルート処理「direct:inboundWorkOrderXml」にスロットルを追加しました。

正確な理由はわかりませんが、ルートの始点に関連してスロットル機能の一部が異なる可能性があることに何らかの形で関連している可能性があります。(したがって、cxf-endpointの問題はdirect-endpointでは発生しません)

于 2013-02-19T12:00:49.897 に答える