【问题标题】:Truncated Response with Camel HTTP使用 Camel HTTP 截断响应
【发布时间】:2014-02-07 16:40:47
【问题描述】:

我有一个调用远程 HTTP 服务器的 HTTP 生产者。我需要读取来自 HTTP 服务器的响应并将其转换为 json 并进行进一步处理。我在处理大型消息体时遇到了一些挑战。我不太确定大小阈值是多少。我的代码看起来

   <from uri="restlet:/foo"/>
   <setHeader headerName="Exchange.HTTP_URI">
            <simple>{{ConfigurableURL}}}</simple>
   </setHeader>
   <to uri="http://dymmyhost"/>
   <transform>
            <simple>${bodyAs('java.lang.String')}</simple>
   </transform>
   <transform>
        <groovy>org.json.simple.JSONValue.parse(request.body.trim())</groovy>
   </transform>

当尺寸足够小时,这没有问题。当它很大时,身体会在最后一次转换中被截断。如果我从最后一次转换中删除 org.json.simple.JSONValue.parse,我最终会收到一条错误消息,例如: org.apache.http.ConnectionClosedException:内容长度分隔的消息正文过早结束(预期:2263;收到:2233

我的挖掘表明存在缓冲问题。因此,我在 URL 中添加了参数 disableStreamCache=true。它没有帮助。

我还用适当的 Camel unmarshaller 替换了 JSON 解析行:

   <unmarshal ref="json"/>

仍然没有帮助。我得到了异常:Content-Length delimited message body 过早结束。

有什么线索吗?

【问题讨论】:

    标签: java spring apache-camel


    【解决方案1】:

    在解析之前将来自远程HTTP服务器的响应写入文件,例如

    <camel:to uri="file:data?fileName=download.htm" />
    

    请参阅http://camel.apache.org/file2.html 了解更多选项。作为一个很好的副作用,这可以保护您的服务器内存资源。解析文件时,使用Reader 而不是将整个内容传输到String。除此之外,Camel 还提供强大的 JSON 支持,请参阅http://camel.apache.org/json.html

    【讨论】:

    • 谢谢彼得。内存不是问题。最重要的是,写入文件系统的性能影响将非常巨大。是的,正如我在帖子中提到的,我还尝试了 Camel-JSON,这是您在上面看到的解组器。
    • 好的。但是您是否尝试将内容下载到文件系统?是否有可能不是从服务器读取全部内容,问题不是解析而是下载?
    • 确实内容已完全下载。我现在从日志中意识到,这两个转换甚至完全处理了它。问题在于它看起来的内容长度标题。远程服务器有一个 gzip 压缩的内容,大小为 1045。现在,我的路由可以通过 RESTLET 访问。但是,内容已经解压;这导致内容长度为 2053。我的 HTTP 客户端最终读取了 1045 个字符,如标题中所示,这导致数据截断。如果我删除这两个转换,我不确定为什么它会以错误的内容长度工作。
    • 我猜这是一个错误,你应该打开一个问题。作为一种解决方法,您可以按照我在回答中的建议将内容下载到文件中。
    猜你喜欢
    • 2013-03-02
    • 2019-04-24
    • 2023-03-29
    • 2015-12-13
    • 1970-01-01
    • 1970-01-01
    • 2018-10-11
    • 2015-04-27
    • 1970-01-01
    相关资源
    最近更新 更多