2015-12-09 3 views
2

Я использую кэширование потоков с помощью этого примера ниже.Использование кэша потоков с помощью 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.

Я хочу продолжать читать файл с потоковой линией в строке, но в процессе я должен прочитать пример первой строки, поэтому я хотел использовать кеш потока, который позволяет мне просматривать файл с начало.

Возможно, я неправильно понял поток кэш.

ответ

1

Если вы хотите разобрать поток дважды (или более раз), вы можете преобразовать его в String before и проанализировать его столько раз, сколько необходимо.

Пожалуйста, проверьте аналогичный вопрос здесь: Exchange.getIn().getBody() returns empty string in camel on second call

+0

Он с не целью, чтобы использовать этот поток несколько раз, так как кэш потока способен перезагрузить поток, и я не знаю, как использовать его @Sergey – Kikou

+0

У вас есть пример кеша потока, в котором вы храните некоторую дату, а затем извлекаете ее. thxs – Kikou

+0

Мой ответ заключается не в том, как использовать потоковый кеш, но он дает вам альтернативное решение вашей проблемы (... просматривать файл с самого начала). Однако, если вы заинтересованы в использовании кеша потока, просто проверьте документацию по адресу http://camel.apache.org/stream-caching.html – Sergey

Смежные вопросы