Hi:
        Previously , I have ask some question about splitter, and the
stream-based splitter pattern can resolve such situations: 
        Enumerate data from large external data source, and process each
data continuously until all data from external-data source is readed;

        But resolve such problem, Usage of Camel's splitter pattern is very
exhausted;  to illustrate it , let's have a example:
        read a condition from jms queue. According to the condition ,
enumerate a external file's content line by line; and we do same operations
on each line;

Although we could use streamed splitter pattern to resolve this problem, as
following :
        1: write my custom iterater to enumerate content from external file;
        2: using streamed-splitter to process each line from file;
        3: using a doTry-doFianlly to close the iterater;

But the real exhausted thing is how to close the iterator, while execute the
process concurrent-ly;
        1) I must using a bean to create the iterator; it seems like :
        2) I must close the iterator while split finished, it looks like
                <dotry>
                        <splitter/>
                        <doFinally>
                                <bean ref="fileProcess"
method="closeLineIterator"/>
                        </doFianlly>
                <dotry>
But configured as above cannot execute concurrently, because the bean itself
cannot ensure to close iterator thread-safely;
In order ensure concurrently execute safe, I must save iterator in the
Exchange's property and close it by property; 
it looks like as following and the following things look like too exhausted.
So does  camel provide a better choice to resolve such problems?

<setProperty name="iteratorId">
        <method bean="fileProcess" method="createLineIterator"/>
<setProperty>
<doTry>
<split streaming="true">
        <getProperty name="iteratorId">
        ...
</split><doFinally>
   <process ref = "CloseIteratorByProperty"/> //here is too exhausted,
because I cannot get a bean from message and invoke it's method;
</doTry>

Class CloseIteratorByProperty implement Process
{
        Void process(Exchange ex)
        {
                Iterator iter = Ex.getProperty("iteratorId");
                ((implementation class)iter).close();
        }
}


Reply via email to