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:sapEndpoint”开始的路由中使用节流阀,而是在路由处理“direct:inboundWorkOrderXml”中添加了节流阀。

不知道确切的原因,可能与节流功能的某些部分可能会因路由的起点而异。(所以直接端点没有遇到 cxf-endpoint 的问题)

于 2013-02-19T12:00:49.897 回答