Apache camel StreamCache FileNotFound在多播路由中发现数据较大的问题

Apache camel StreamCache FileNotFound在多播路由中发现数据较大的问题,apache-camel,Apache Camel,我们正在使用camel 2.13.2-我有一个带有聚合策略的多播路由。 在每个多播分支中,我们都有一个定制的camel组件,它返回大量数据(大约4MB)并写入流缓存(缓存的输出流),我们需要在多播中聚合数据(聚合策略) Object body = exchange.getIn().getBody(); if( body instanceof StreamCache){ StreamCache cache = (StreamCac

我们正在使用camel 2.13.2-我有一个带有聚合策略的多播路由。
在每个多播分支中,我们都有一个定制的camel组件,它返回大量数据(大约4MB)并写入流缓存(缓存的输出流),我们需要在多播中聚合数据(聚合策略)

        Object body = exchange.getIn().getBody(); 
        if( body instanceof StreamCache){ 
                StreamCache cache = (StreamCache)body; 
                xml = new String(convertToByteArray(cache,exchange));                                            
                exchange.getIn().setBody(xml); 
        } 
在聚合策略中,我需要使用camel XPathBuilder进行XPath计算。 因此,我尝试读取正文并将其从StreamCache转换为byte[],以避免XPathBuilder中的“从类型转换为类型时出错:org.apache.camel.converter.stream.InputStreamCache”

        Object body = exchange.getIn().getBody(); 
        if( body instanceof StreamCache){ 
                StreamCache cache = (StreamCache)body; 
                xml = new String(convertToByteArray(cache,exchange));                                            
                exchange.getIn().setBody(xml); 
        } 
当我尝试读取聚合策略开头的正文时,我得到以下错误

        Object body = exchange.getIn().getBody(); 
        if( body instanceof StreamCache){ 
                StreamCache cache = (StreamCache)body; 
                xml = new String(convertToByteArray(cache,exchange));                                            
                exchange.getIn().setBody(xml); 
        } 
*/tmp/camel/camel-tmp-4e00bf8a-4a42-463a-b046-5ea2d7fc8161/cos6047774870387520936.tmp(无此类文件或目录),原因:FileNotFoundException:/tmp/camel/camel-tmp-4e00bf8a-4a42-463a-b046-5ea2d7fc8161/cos6047774870387520936.tmp(无此类文件或目录)。 在java.io.FileInputStream.open(本机方法) 位于java.io.FileInputStream。(FileInputStream.java:138) org.apache.camel.converter.stream.FileInputStreamCache.createInputStream(FileInputStreamCache.java:123)org.apache.camel.converter.stream.FileInputStreamCache.getInputStream(FileInputStreamCache.java:117) 位于org.apache.camel.converter.stream.FileInputStreamCache.writeTo(FileInputStreamCache.java:93) 位于org.apache.camel.converter.stream.StreamCacheConverter.convertToByteArray(StreamCacheConverter.java:102) 位于com.sap.it.rt.camel.aggregate.strategies.MergeAtXPathAggregationStrategy.convertToByteArray(MergeAtXPathAggregationStrategy.java:169) 在com.sap.it.rt.camel.aggregate.strategies.MergeAtXPathAggregationStrategy.ConvertoxPathCompatibleType(MergeAtXPathAggregationStrategy.java:161) *

        Object body = exchange.getIn().getBody(); 
        if( body instanceof StreamCache){ 
                StreamCache cache = (StreamCache)body; 
                xml = new String(convertToByteArray(cache,exchange));                                            
                exchange.getIn().setBody(xml); 
        } 
以下是引发错误的代码行:

        Object body = exchange.getIn().getBody(); 
        if( body instanceof StreamCache){ 
                StreamCache cache = (StreamCache)body; 
                xml = new String(convertToByteArray(cache,exchange));                                            
                exchange.getIn().setBody(xml); 
        } 
通过在多播相关路由中设置10MB的阈值,禁用流缓存写入文件,我们可以使用聚合策略。但我们不想这样做,因为我们可能会收到更大的数据

        Object body = exchange.getIn().getBody(); 
        if( body instanceof StreamCache){ 
                StreamCache cache = (StreamCache)body; 
                xml = new String(convertToByteArray(cache,exchange));                                            
                exchange.getIn().setBody(xml); 
        } 
<camel:camelContext id="multicast_xml_1" streamCache="true">
    <camel:properties>
        <camel:property key="CamelCachedOutputStreamCipherTransformation" value="RC4"/>
        <camel:property key="CamelCachedOutputStreamThreshold" value="100000000"/>
    </camel:properties>
    ....
</camel:camelContext>
如果我在任何多播分支的任何组件中写入CachedOutputStream时尝试设置closedOnCompletion=false,我就能够避免这个问题

        Object body = exchange.getIn().getBody(); 
        if( body instanceof StreamCache){ 
                StreamCache cache = (StreamCache)body; 
                xml = new String(convertToByteArray(cache,exchange));                                            
                exchange.getIn().setBody(xml); 
        } 
但这是一个泄漏的解决方案,因为streamcache临时文件可能永远无法清理。。。因此,在读取AggregationStrategy中的数据后,我尝试关闭并清理缓存流

        Object body = exchange.getIn().getBody(); 
        if( body instanceof StreamCache){ 
                StreamCache cache = (StreamCache)body; 
                xml = new String(convertToByteArray(cache,exchange));                                            
                exchange.getIn().setBody(xml); 
        } 
是否可以调整多播处理器,使多播分支交换仅在多播结束时聚合后达到“完成”状态

        Object body = exchange.getIn().getBody(); 
        if( body instanceof StreamCache){ 
                StreamCache cache = (StreamCache)body; 
                xml = new String(convertToByteArray(cache,exchange));                                            
                exchange.getIn().setBody(xml); 
        } 
请在这个问题上提供帮助/建议,因为我对使用camel多播还不熟悉

        Object body = exchange.getIn().getBody(); 
        if( body instanceof StreamCache){ 
                StreamCache cache = (StreamCache)body; 
                xml = new String(convertToByteArray(cache,exchange));                                            
                exchange.getIn().setBody(xml); 
        } 
谢谢,
Lakshmi

我在尝试向Restlet请求发送大于1MB的JSON响应时引发了类似的异常(是的,我知道1MB JSON太大):

        Object body = exchange.getIn().getBody(); 
        if( body instanceof StreamCache){ 
                StreamCache cache = (StreamCache)body; 
                xml = new String(convertToByteArray(cache,exchange));                                            
                exchange.getIn().setBody(xml); 
        } 
我没有在这个路由中使用多播,只是简单地说

        Object body = exchange.getIn().getBody(); 
        if( body instanceof StreamCache){ 
                StreamCache cache = (StreamCache)body; 
                xml = new String(convertToByteArray(cache,exchange));                                            
                exchange.getIn().setBody(xml); 
        } 
restlet请求->服务->Jackson marshall=>错误

        Object body = exchange.getIn().getBody(); 
        if( body instanceof StreamCache){ 
                StreamCache cache = (StreamCache)body; 
                xml = new String(convertToByteArray(cache,exchange));                                            
                exchange.getIn().setBody(xml); 
        } 
我将Camel 2.14.0和Restlet 2.2.2与jdk7和springboot1.0.2/Jetty一起使用

        Object body = exchange.getIn().getBody(); 
        if( body instanceof StreamCache){ 
                StreamCache cache = (StreamCache)body; 
                xml = new String(convertToByteArray(cache,exchange));                                            
                exchange.getIn().setBody(xml); 
        } 
这可能与我的问题有关

        Object body = exchange.getIn().getBody(); 
        if( body instanceof StreamCache){ 
                StreamCache cache = (StreamCache)body; 
                xml = new String(convertToByteArray(cache,exchange));                                            
                exchange.getIn().setBody(xml); 
        }