当前位置: 首页 > 知识库问答 >
问题:

使用SOAPendpoint的Apache Camel节流-> TransformerException

訾淇
2023-03-14

我们有一个提供SOAP服务的ApacheCamel应用程序。“初始路由”从Apache CFX提供的endpoint开始。

我们需要一个简单的机制来防止消息处理得“太快”(并且没有大量的可扩展性需求)。

因此,我们最终尝试了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 endpoint会收到空或无效的 XML?没有油门定义,一切正常。经过短暂的尝试,消息正文似乎仍然包含XML字符串?

一些想法?

共有2个答案

谷泳
2023-03-14

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

不知道确切的原因,可能与油门功能的某些部分可能与路线的起点有关。(因此,直接endpoint未遇到cxfendpoint的问题)

赵永新
2023-03-14

使用Camel错误处理进行重新交付时,请注意流有效负载。查看流缓存:http://camel.apache.org/stream-caching.html

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

 类似资料:
  • Apache Camel:2.12.2,activemq:5.7 我们注意到,在下面的路由中,对于前100次交换,节流工作正常。此后,它不是每秒发送100次交换,而是每秒仅发送1次交换。现在,如果我们将timePeriodMillis设置为100,它似乎可以正常工作。注意,我们同时发送500个交换。

  • 主要内容:字节输入流,字节输出流,字节数组输入流,字节数组输出流,文件输入流,文件输出流在本章的第一节《 Java流的概念》中就提到 InputStream 是 Java 所有字节输入流类的父类,OutputStream 是 Java 所有字节输出流类的父类,它们都是一个抽象类,因此继承它们的子类要重新定义父类中的抽象方法。 下面首先介绍上述两个父类提供的常用方法,然后介绍如何使用它们的子类输入和输出字节流,包括 ByteArrayInputStream 类、ByteArrayOut

  • 我正在尝试向异步路由发送消息,但它不起作用。我刚刚在github上创建了一个项目来模拟这个问题

  • 我想测试以下骆驼路线。我在网上找到的所有例子都有以文件开头的路由,在我的例子中,我有一个Springbean方法,每隔几分钟就会被调用一次,最后消息被转换并移动到jms以及审计目录。 我对这条路线的写测试毫无头绪。目前我在测试用例中所拥有的是

  • 我正在使用apache camel cxf开发一个Web服务(肥皂),我遇到了这个错误。 Java . lang . illegalargumentexception:Part { http://blue print . camel . ngt . TN/}返回的类型应为[ltn . ngt . camel . blue print . WB _ subscriptions;,而不是org . A

  • 问题内容: 使用时是否可以轻松地限制kbps ?如果是这样的话,将不胜感激您可以指导我的任何代码示例或资源。 问题答案: 模块中有功能。如果将-function / object实现为令牌存储桶或泄漏存储桶,则将具有全局速率限制。 编辑: 仔细检查后,我发现进行全球限速并不像我想的那么容易。仅给出下载量和总大小,仅靠它们本身不足以提供与令牌桶配合使用的信息。解决该问题的一种方法是,在每个速率限制器