使用Apache Camel的流缓存

时间:2015-12-09 10:11:39

标签: java caching apache-camel

我在下面的例子中使用了流缓存。

我有三条路线。

首先,我使用带有令牌的分割流" \ n",读取按行分割的文件。

     <route id="SPLIT-FLOW" streamCache="true">
        <from uri="file:src/data/forSplitCaching?noop=true"/>
        <split streaming="true">
            <tokenize token="\n"/>
            <to uri="direct:PROCESS-BUSINESS"/>
        </split>
    </route>

然后我做了一个业务流程:

    <route id="PROCESS-BUSINESS" streamCache="true">
        <from uri="direct:PROCESS-BUSINESS"/>
        <bean ref="ProcessBusiness" method="dealRecord"/>
        <to uri="direct:STREAM-CACHING"/>
    </route>

    public class ProcessBusiness {

     public String dealRecord(@Body String body){
     System.out.println(body);
     return body;
}

最后,

    <route id="STREAM-CACHING">
        <from uri="direct:STREAM-CACHING"/>
        <bean ref="ProcessStreamCaching" method="usingStream"/>
        <setHeader headerName="CamelFileName">
            <simple>${header.CamelFileName}.${header.CamelSplitIndex}   </simple>
        </setHeader>
        <to uri="file:src/out"/>
    </route>

   public class ProcessStreamCaching {

     public String usingStream(Exchange exchange){
     Object o = exchange.getIn().getBody(StreamCache.class);
     return  o.toString();
    }

我希望在此过程中获取整个文件(ProcessStreamCaching)。

如何正确使用流缓存?

拆分前的文件包含:

XXXXX
YYYYY
ZZZZZ
AAAAAAAAAAAAA
BBBBBBBB
CCCCCCCCCCCCCCCCCCCCCCCCCCCCC
SSSSSSSSSSSSSSSS
SSQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ
ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
Z

我认为流缓存能够将文件的所有行放在缓存中,我可以检索这些行。

如何查看缓存中的内容?

我想当我在此路由streamCache="true"添加<route id="SPLIT-FLOW" >时,拆分器的每一行都将被放置在缓存中。 (或者可能是整个文件)

在上一个进程ProcessStreamCaching,如果我想从头开始重新加载inputStream,但在此过程中,我无法阅读inputStream

我想继续每行使用流线读取文件,但是在进程中我需要读取第一行的例子,这就是为什么我想使用流缓存,谁允许我从文件中浏览文件开始。

可能是我误解了Stream Cache。

1 个答案:

答案 0 :(得分:1)

如果要解析流两次(或更多次),可以在之前将其转换为String,并根据需要多次解析它。

请在此处查看类似问题:Exchange.getIn().getBody() returns empty string in camel on second call