【问题标题】:Apache Camel throttling with a SOAP endpoint -> TransformerExceptionApache Camel 使用 SOAP 端点进行节流 -> TransformerException
【发布时间】:2013-02-03 01:28:55
【问题描述】:

我们有一个提供 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 字符串?

一些想法?

【问题讨论】:

    标签: soap cxf apache-camel throttling


    【解决方案1】:

    当使用 Camel 错误处理进行重新传递时,请注意流式负载。请参阅:http://camel.apache.org/stream-caching.html

    Camel CXF 文档页面顶部还有一个提示:http://camel.apache.org/cxf 关于此

    【讨论】:

    • 谢谢,好点子。无论如何,我实际上并没有尝试重新交付,我不确定这是否与此有关。添加了流缓存尝试过一次,但没有任何区别:(
    【解决方案2】:

    最终解决方案比我想象的要简单。我没有在从“cxf:bean:sapEndpoint”开始的路由中使用节流阀,而是在路由处理“direct:inboundWorkOrderXml”中添加了节流阀。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多