【问题标题】:Apache Camel how to get the input xml payload size?Apache Camel 如何获取输入的 xml 有效负载大小?
【发布时间】:2018-05-24 01:25:10
【问题描述】:

有没有办法我们可以在交换体中获取输入负载大小。如果内容大小超过 50 MB,我想 Gzip 内容。

【问题讨论】:

    标签: java apache-camel jbossfuse


    【解决方案1】:

    有点迂回,但我用骆驼cache streaming。设置好后,只需检查 body 是否已转换为 StreamCache。 (允许多次读取的流。在处理非常大的文件时主要有用)。我必须处理 10gb+ 的文件,所以这是一个很好的方法,不会因为内存不足而烧毁 jvm,而且也不必担心读取它会丢失有效负载。

    蓝图(不确定 jboss 等价物是什么)想要

    <!-- define a bean of type StreamCachingStrategy which CamelContext will automaticly use -->
    <bean id="streamStrategy" class="org.apache.camel.impl.DefaultStreamCachingStrategy">
        <property name="spoolDirectory" value="${java.io.tmpdir}/camelcache/#uuid#/"/>
        <property name="spoolThreshold" value="52428800"/>
        <property name="spoolUsedHeapMemoryThreshold" value="70"/>
        <property name="anySpoolRules" value="true"/>
    </bean>
    
    <camelContext streamCache="true" xmlns="http://camel.apache.org/schema/blueprint">
    

    您可以创建一个Predicate bean 来进行实际测试,并在骆驼路由中使用它来影响流控制。

    如果你不担心内存,你可能会发疯,在你的谓词中,将payload作为流,将所有字节作为byte[]读入内存,然后测试byte[的大小] (或从流中读取字节数)。取决于您的负载源,如果您不先缓存它,您可能无法重置流。

    【讨论】:

    • 您好 Tezra,感谢您的回复,但这回答了我的问题。如果大小超过 50 mb,我想以不同的方式在骆驼路线中处理。我没有面临保险丝的oom问题,但下游系统存在限制。
    • @Ravi 你可以创建一个Predicate bean 来做实际测试,并在骆驼路由中使用它来影响流控制。 (同样,我就是这样做的,以保持它的简单和健壮)。如果你不担心内存,你可能会发疯,在你的谓词中,将有效负载作为流,将所有字节作为 byte[] 读入内存,然后测试 byte[] 的大小。取决于您的有效负载源,如果您不先缓存它,您可能无法重置流。
    • @vikingsteve 我正在根据文件类型/内容移动任意文件。大多数实际上是一个合理的尺寸,但每隔一段时间,我就会得到一个大的东西,比如一个长的、高质量的视频。因此,只要服务器有磁盘空间,就不必担心有效负载的大小。 =P
    • 很高兴知道骆驼框架在重负载下是可靠的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-04-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-23
    • 1970-01-01
    相关资源
    最近更新 更多