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 文字列が含まれているように見えますか?
いくつかのアイデア?