java - Apache Camel 如何获取输入的 xml 有效负载大小?
问题描述
有没有办法我们可以在交换正文中获取输入有效负载大小。如果内容大小超过 50 MB,我想 Gzip 内容。
解决方案
有点迂回,但我使用骆驼缓存流。设置好后,只需检查 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 来进行实际测试,并在骆驼路由中使用它来影响流控制。
如果你不担心内存,你可能会发疯,在你的谓词中,将有效负载作为流,将所有字节作为字节[]读入内存,然后测试字节[]的大小(或从流中读取字节数)。取决于您的有效负载源,如果您不先缓存它,您可能无法重置流。
推荐阅读
- c++ - CLion 未在树视图中显示 Google 测试
- java - 空列表正在返回。如何解决这个问题?
- android - Android - 如何制作无限滚动视图
- python - Tensorflow中如何获取张量的值
- c++ - 如何制作打印菜单的功能?
- javascript - 通过 Javascript 从 Nav2015 消费 OData - 身份验证失败
- php - PHP(Laravel) 存储类对象
- java - 如何在基于 Spring 会话 Java 的配置中更改 MaxInactiveIntervalInSeconds 值?
- ruby-on-rails - Microsoft Graph API 身份验证 - 范围无效
- javascript - Angular - 无法读取未定义的属性“id”