我们有一个提供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字符串?
一些想法?
答案 0 :(得分:1)
使用Camel错误处理进行重新传递时,请注意流式传输有效负载。请参阅:http://camel.apache.org/stream-caching.html
了解流缓存Camel CXF文档页面顶部还有一个提示:http://camel.apache.org/cxf关于此
答案 1 :(得分:0)
最后解决方案比我想象的更简单。我没有在从“cxf:bean:sapEndpoint”开始的路线中使用油门,而是将油门添加到路线处理“direct:inboundWorkOrderXml”。
不知道确切的原因,可能与某种程度上相关的节流功能的某些部分可能在路线的起点端点上有所不同。 (因此直接端点没遇到cxf-endpoint的问题)