Thanks for all these explictions ! Hope I will give back my knowledge when I will have enough camel knowledge :)
With filter, I goto my enrich only for the first line of my file. .filter(simple("${property.CamelSplitIndex} == 0")) .enrich("direct:datasource", new AggregationEnrichissementZone()) I gonna also try your method Raul. Thanks 2013/3/7 Raul Kripalani <r...@evosent.com> > If you want to query the DB once, you should definitely restructure the > route a bit. > > Here's the simplest option IMO. The goal is to query once and make the > query result available to all split tasks: > > - Run bindy before the split, which will generate a List of AED objects. > - Create a small bean that constructs the SQL query from the List of AED. > - Do the JDBC enrichment before the split. > - In your aggregation strategy, inject the result of the DB query in an > exchange property. > - Then run the split without specifying any split criteria (no tokenize). > We split lists into its constituents out of the box. > - Inside the split body, enrich your AED object with the DB results stored > in the above exchange property. > > Hope this helps! > Raúl. > > Sent while on the move. > On 7 Mar 2013 08:25, "Jean Francois LE BESCONT" <jflebesc...@gmail.com> > wrote: > > > Sorry if my explanation are not good ... :) > > > > I have a csv file. I would like to process this file to enrich with data > > in sql table (then write enriched line in output). > > > > I process file with a binding in business class : > > > > .from("file://mycsv.csv") > > .split() > > .tokenize("\n") > > .streaming() > > .unmarshal() > > .bindy(BindyType.Csv, AED.class) > > > > Then I would like to enrich the line converted in AED to add element > from a > > DB table : > > .enrich("direct:datasource", new AggregationEnrichissementZone()) > > > > > > The AggregationEnrichissementZone do my business transformation with both > > the current line and the content of the database which is in > > direct:datasource. It works no problem ! The > > direct:datasource is called correctly and retrieve the data from sql > table. > > Initially I wrote it like this : > > > > from("direct:datasource") > > .setBody(constant("SELECT * FROM TEST")) > > .to("jdbc:dataSource") > > .to("direct:ds") > > .end(); > > > > But direct:datasource is called for each line which cost to much time. I > > would like to make the database query only once for my csv file. > > > > Thanks > > > > JF > > > > > > > > > > 2013/3/7 Claus Ibsen <claus.ib...@gmail.com> > > > > > On Thu, Mar 7, 2013 at 8:03 AM, Jean Francois LE BESCONT > > > <jflebesc...@gmail.com> wrote: > > > > it is a really simple studies case no ? I can't be the first guy > who > > > > don't want to reload the datasource on each line isn't it ? > > > > > > > > > > I dont think people can understand what you try to do and pasting a > > > lot of code and with little detail to go along. > > > I suggest to debug your application and see what goes on and figure > > > out your solution. > > > > > > > > > > > > > > > > > 2013/3/6 Jean Francois LE BESCONT <jflebesc...@gmail.com> > > > > > > > >> I made a mistake in my test. It doesn't do what expected ... > > > >> > > > >> Still the same example : > > > >> > > > >> .from(...) > > > >> .split() > > > >> .tokenize("\n") > > > >> .streaming() > > > >> .unmarshal() > > > >> .bindy(BindyType.Csv, AED.class) > > > >> .enrich("direct:refreshReferentielDynamic", new > > > >> AggregationEnrichissementZone()) > > > >> > > > >> And a : > > > >> > > > >> from("direct:refreshReferentielDynamic") > > > >> .processRef("validatingProcessor") > > > >> > > > >> .end(); > > > >> > > > >> > > > >> And > > > >> > > > >> > > > >> public class ValidatingProcessor implements Processor { > > > >> > > > >> @Autowired > > > >> DriverManagerDataSource dataSource; > > > >> public void process(Exchange exchange) throws Exception { > > > >> > > > >> > > > >> Integer idxParse = (Integer) > > exchange.getProperty(Exchange.SPLIT_INDEX); > > > >> if (idxParse != null & idxParse == 0) { > > > >> JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource); > > > >> List<Map<String, Object>> ref = jdbcTemplate > > > >> .queryForList("SELECT ID , CODE , LIBELLE FROM ZONE_T "); > > > >> Map<String, Zone> newRef = new HashMap(); > > > >> for (Map<String, Object> map : ref) { > > > >> int id=(Integer) map.get("ID"); > > > >> String code =(String) map.get("CODE"); > > > >> String libelle =(String)map.get("LIBELLE"); > > > >> newRef.put(code, new Zone(id,code,libelle)); > > > >> } > > > >> exchange.getOut().setBody(newRef) ; > > > >> > > > >> > > > >> } > > > >> } > > > >> > > > >> > > > >> The problem is that in my AggregationStrategy zones which is > populate > > > >> before has data only for the first line ( the first spit index). > > > >> > > > >> > > > >> public class AggregationEnrichissementZone implements > > > AggregationStrategy { > > > >> > > > >> Logger LOG = > > > LoggerFactory.getLogger(AggregationEnrichissementZone.class); > > > >> > > > >> @Override > > > >> public Exchange aggregate(Exchange original, Exchange resource) { > > > >> > > > >> Map<String, Zone> zones = (Map<String, Zone>) > > > resource.getIn().getBody(); > > > >> > > > >> > > > >> Any idea ? > > > >> > > > >> > > > >> Thanks ! > > > >> > > > >> > > > >> > > > >> > > > >> 2013/3/6 Jean Francois LE BESCONT <jflebesc...@gmail.com> > > > >> > > > >>> Thanks Claus ! > > > >>> > > > >>> Tricky but it works :) > > > >>> > > > >>> > > > >>> 2013/3/6 Claus Ibsen <claus.ib...@gmail.com> > > > >>> > > > >>>> On Wed, Mar 6, 2013 at 1:05 PM, Jean Francois LE BESCONT > > > >>>> <jflebesc...@gmail.com> wrote: > > > >>>> > When we do an enrich, the *resourceUri ( in my example > > > >>>> *.enrich("direct:ds", > > > >>>> > new AggregationStrategyRessource())) is called every time. > > > >>>> > > > > >>>> > When I parse a file, big query with all the datasource while be > > > called > > > >>>> > every, is there a trick to tell the route to execute only one ? > I > > > have > > > >>>> > watch camel cache but I have understand that it is used for > > > something > > > >>>> else. > > > >>>> > > > > >>>> > Thanks ! > > > >>>> > > > > >>>> > > > >>>> You can use a filter / content based route and only use the enrich > > the > > > >>>> 1st time. > > > >>>> When you use the splitter the exchange has a property with the > split > > > >>>> index, so the 1st time the index is zero. > > > >>>> > > > >>>> The key for that property is Exchange.SPLIT_INDEX > > > >>>> > > > >>>> > > > > >>>> > > > > >>>> > > > > >>>> > 2013/3/6 Jean Francois LE BESCONT <jflebesc...@gmail.com> > > > >>>> > > > > >>>> >> Thanks Claus for the link ( have you an HashMap off the FAQ in > > the > > > >>>> head ? > > > >>>> >> :) > > > >>>> >> > > > >>>> >> Don't forget to add : > > > >>>> >> > > > >>>> >> > > > >>>> >> original.getOut().setHeaders(original.getIn().getHeaders()); > > > >>>> >> > > > >>>> >> > > > >>>> >> When enrich with strategy ! > > > >>>> >> > > > >>>> >> > > > >>>> >> 2013/3/6 Claus Ibsen <claus.ib...@gmail.com> > > > >>>> >> > > > >>>> >>> On Wed, Mar 6, 2013 at 10:26 AM, Jean Francois LE BESCONT > > > >>>> >>> <jflebesc...@gmail.com> wrote: > > > >>>> >>> > My mistake ...I used resource.getOut().getBody(); instead > > > >>>> >>> > od resource.getIn().getBody(); > > > >>>> >>> > > > > >>>> >>> > > > >>>> >>> Yeah see this FAQ > > > >>>> >>> > > > >>>> > > > http://camel.apache.org/using-getin-or-getout-methods-on-exchange.html > > > >>>> >>> > > > >>>> >>> > > > > >>>> >>> > public Exchange aggregate(Exchange original, Exchange > > > resource) { > > > >>>> >>> > > > > >>>> >>> > AED originalBody = (AED)original.getIn().getBody(); > > > >>>> >>> > Object resourceResponse = (Object) > resource.getIn().getBody(); > > > >>>> >>> > > > > >>>> >>> > LOG.info("originalBody " + originalBody ) ; > > > >>>> >>> > LOG.info("resourceResponse " + resourceResponse ) ; > > > >>>> >>> > // do stuff with > > > >>>> >>> > > > > >>>> >>> > return resource; > > > >>>> >>> > } > > > >>>> >>> > > > > >>>> >>> > Thanks raul for the help ! :) > > > >>>> >>> > > > > >>>> >>> > > > > >>>> >>> > 2013/3/6 Jean Francois LE BESCONT <jflebesc...@gmail.com> > > > >>>> >>> > > > > >>>> >>> >> Thanks Raul ! > > > >>>> >>> >> > > > >>>> >>> >> I haven't found simple example enrich here ( > > > >>>> >>> >> http://camel.apache.org/content-enricher.html, > > > direct:resource in > > > >>>> >>> never > > > >>>> >>> >> explains ). Perharps that I haven't understand fondamental > > but > > > >>>> it's a > > > >>>> >>> >> huge framework and learning needs time :) > > > >>>> >>> >> > > > >>>> >>> >> So I have a querie : > > > >>>> >>> >> > > > >>>> >>> >> from("direct:refreshReferentielDynamic") > > > >>>> >>> >> .setBody(constant("SELECT * FROM TEST")) > > > >>>> >>> >> .to("jdbc:dataSource") > > > >>>> >>> >> .to("direct:ds") > > > >>>> >>> >> .end(); > > > >>>> >>> >> > > > >>>> >>> >> Plus : > > > >>>> >>> >> > > > >>>> >>> >> from("direct:ds").to("log:dans.directds").end(); > > > >>>> >>> >> > > > >>>> >>> >> Otherwise it doesn't works. > > > >>>> >>> >> > > > >>>> >>> >> > > > >>>> >>> >> And an " main route " : > > > >>>> >>> >> > > > >>>> >>> >> from("file://....") > > > >>>> >>> >> .split() > > > >>>> >>> >> .tokenize("\n") > > > >>>> >>> >> .enrich("direct:ds", new AggregationStrategyRessource()) > > > >>>> >>> >> > > > >>>> >>> >> With : > > > >>>> >>> >> > > > >>>> >>> >> > > > >>>> >>> >> public class AggregationStrategyRessource implements > > > >>>> >>> AggregationStrategy { > > > >>>> >>> >> > > > >>>> >>> >> > > > >>>> >>> >> public Exchange aggregate(Exchange original, Exchange > > > >>>> resource) { > > > >>>> >>> >> > > > >>>> >>> >> return resource; // for the moment > > > >>>> >>> >> } > > > >>>> >>> >> > > > >>>> >>> >> } > > > >>>> >>> >> > > > >>>> >>> >> But original is always null ... > > > >>>> >>> >> > > > >>>> >>> >> Do you see with ? > > > >>>> >>> >> > > > >>>> >>> >> > > > >>>> >>> >> > > > >>>> >>> >> > > > >>>> >>> >> > > > >>>> >>> >> > > > >>>> >>> >> > > > >>>> >>> >> 2013/3/6 Jean Francois LE BESCONT <jflebesc...@gmail.com> > > > >>>> >>> >> > > > >>>> >>> >>> Hey ! > > > >>>> >>> >>> > > > >>>> >>> >>> A picture is sometime better than explication :) I try to > > > make a > > > >>>> >>> really > > > >>>> >>> >>> simple test ( equivalent of MAP with lookup in ETL) : > > > >>>> >>> >>> > > > >>>> >>> >>> > > > >>>> >>> >>> > > > >>>> ------------------------- > > > >>>> >>> >>> | TABLE TEST | > > > >>>> >>> >>> > > > >>>> ------------------------- > > > >>>> >>> >>> | COL1 | COL2 > | > > > >>>> >>> >>> | jack | 2 > > > | > > > >>>> >>> >>> | bob | 3 > > > | > > > >>>> >>> >>> > > > >>>> ------------------------ > > > >>>> >>> >>> | > > > >>>> >>> >>> | > > > >>>> >>> >>> | > > > >>>> >>> >>> | > > > >>>> >>> >>> | > > > >>>> >>> >>> ---------------- > > > ---------------------- > > > >>>> >>> >>> ------------------------ > > > >>>> >>> >>> | FILE INPUT | | ENRICH ? | > > > >>>> >>> >>> | FILE OUTPUT | > > > >>>> >>> >>> ---------------- > > > ---------------------- > > > >>>> >>> >>> ----------------------- > > > >>>> >>> >>> | jack | cool | >>>>>>>>> | | > > > >>>>>>>>> > > > >>>> | > > > >>>> >>> jack > > > >>>> >>> >>> | cool | 2 | > > > >>>> >>> >>> | bob | foo | | > > > | > > > >>>> >>> >>> | bob | foo | 3 | > > > >>>> >>> >>> ---------------- > > > >>>> ----------------------- > > > >>>> >>> >>> ------------------------ > > > >>>> >>> >>> > > > >>>> >>> >>> > > > >>>> >>> >>> > > > >>>> >>> >>> > > > >>>> >>> >>> > > > >>>> >>> >>> > > > >>>> >>> >>> > > > >>>> >>> >>> 2013/3/6 Jean Francois LE BESCONT <jflebesc...@gmail.com> > > > >>>> >>> >>> > > > >>>> >>> >>>> If i do: > > > >>>> >>> >>>> public class AggregationStrategyRessource implements > > > >>>> >>> AggregationStrategy > > > >>>> >>> >>>> { > > > >>>> >>> >>>> > > > >>>> >>> >>>> @Override > > > >>>> >>> >>>> public Exchange aggregate(Exchange original, Exchange > > > >>>> resource) { > > > >>>> >>> >>>> int i = 1 / 0; > > > >>>> >>> >>>> return original; > > > >>>> >>> >>>> } > > > >>>> >>> >>>> } > > > >>>> >>> >>>> > > > >>>> >>> >>>> no exception are thows. > > > >>>> >>> >>>> > > > >>>> >>> >>>> > > > >>>> >>> >>>> > > > >>>> >>> >>>> 2013/3/6 Jean Francois LE BESCONT <jflebesc...@gmail.com > > > > > >>>> >>> >>>> > > > >>>> >>> >>>>> thks Raul > > > >>>> >>> >>>>> > > > >>>> >>> >>>>> For the moment it's a simple : > > > >>>> >>> >>>>> > > > >>>> >>> >>>>> public class AggregationStrategyRessource implements > > > >>>> >>> >>>>> AggregationStrategy { > > > >>>> >>> >>>>> > > > >>>> >>> >>>>> @Override > > > >>>> >>> >>>>> public Exchange aggregate(Exchange original, > Exchange > > > >>>> resource) > > > >>>> >>> { > > > >>>> >>> >>>>> return original; > > > >>>> >>> >>>>> } > > > >>>> >>> >>>>> > > > >>>> >>> >>>>> } > > > >>>> >>> >>>>> > > > >>>> >>> >>>>> If I put a debug point on it, it is never fired .... > > > >>>> >>> >>>>> > > > >>>> >>> >>>>> > > > >>>> >>> >>>>> > > > >>>> >>> >>>>> > > > >>>> >>> >>>>> > > > >>>> >>> >>>>> 2013/3/6 Raúl Kripalani <r...@evosent.com> > > > >>>> >>> >>>>> > > > >>>> >>> >>>>>> Can we see the code of AggregationStrategyRessource? > > > >>>> >>> >>>>>> > > > >>>> >>> >>>>>> Regards, > > > >>>> >>> >>>>>> Raúl. > > > >>>> >>> >>>>>> > > > >>>> >>> >>>>>> On Mar 5, 2013, at 23:30, Jean Francois LE BESCONT > wrote: > > > >>>> >>> >>>>>> > > > >>>> >>> >>>>>> > Hey, > > > >>>> >>> >>>>>> > > > > >>>> >>> >>>>>> > I have this > > > > >>>> >>> >>>>>> > > > > >>>> >>> >>>>>> > > > >>>> >>> > > > >>>> > > > > > > http://camel.465427.n5.nabble.com/Enrich-message-with-data-from-dynamic-sql-query-td5329427.html > > > >>>> >>> >>>>>> > > > > >>>> >>> >>>>>> > But I haven't found a solution to my question. > > > >>>> >>> >>>>>> > > > > >>>> >>> >>>>>> > How can enrich my stream with data from a queries ? > > > >>>> >>> >>>>>> > > > > >>>> >>> >>>>>> > I have a a route called from the start : > > > >>>> >>> >>>>>> > > > > >>>> >>> >>>>>> > from("direct:refreshReferentielDynamic") > > > >>>> >>> >>>>>> > // > > > >>>> >>> >>>>>> > .setBody(constant("SELECT * FROM TEST")) > > > >>>> >>> >>>>>> > // > > > >>>> >>> >>>>>> > .to("jdbc:dataSource") > > > >>>> >>> >>>>>> > // > > > >>>> >>> >>>>>> > .to("direct:ds") > > > >>>> >>> >>>>>> > // > > > >>>> >>> >>>>>> > .end(); > > > >>>> >>> >>>>>> > > > > >>>> >>> >>>>>> > > > > >>>> >>> >>>>>> > End I would like to acces data in memory in direct:ds > > > from > > > >>>> an > > > >>>> >>> other > > > >>>> >>> >>>>>> route. > > > >>>> >>> >>>>>> > I have try this : > > > >>>> >>> >>>>>> > > > > >>>> >>> >>>>>> > from("foo"). > > > >>>> >>> >>>>>> > [...] > > > >>>> >>> >>>>>> > .enrich("direct:ds", new > > AggregationStrategyRessource()) > > > >>>> >>> >>>>>> > > > > >>>> >>> >>>>>> > But code in AggregationStrategyRessource is not > called > > > ... > > > >>>> and > > > >>>> >>> body > > > >>>> >>> >>>>>> is > > > >>>> >>> >>>>>> > replace by the content of the query. > > > >>>> >>> >>>>>> > > > > >>>> >>> >>>>>> > Thks ! > > > >>>> >>> >>>>>> > > > > >>>> >>> >>>>>> > Thks ! > > > >>>> >>> >>>>>> > > > >>>> >>> >>>>>> > > > >>>> >>> >>>>> > > > >>>> >>> >>>> > > > >>>> >>> >>> > > > >>>> >>> >> > > > >>>> >>> > > > >>>> >>> > > > >>>> >>> > > > >>>> >>> -- > > > >>>> >>> Claus Ibsen > > > >>>> >>> ----------------- > > > >>>> >>> Red Hat, Inc. > > > >>>> >>> FuseSource is now part of Red Hat > > > >>>> >>> Email: cib...@redhat.com > > > >>>> >>> Web: http://fusesource.com > > > >>>> >>> Twitter: davsclaus > > > >>>> >>> Blog: http://davsclaus.com > > > >>>> >>> Author of Camel in Action: http://www.manning.com/ibsen > > > >>>> >>> > > > >>>> >> > > > >>>> >> > > > >>>> > > > >>>> > > > >>>> > > > >>>> -- > > > >>>> Claus Ibsen > > > >>>> ----------------- > > > >>>> Red Hat, Inc. > > > >>>> FuseSource is now part of Red Hat > > > >>>> Email: cib...@redhat.com > > > >>>> Web: http://fusesource.com > > > >>>> Twitter: davsclaus > > > >>>> Blog: http://davsclaus.com > > > >>>> Author of Camel in Action: http://www.manning.com/ibsen > > > >>>> > > > >>> > > > >>> > > > >> > > > > > > > > > > > > -- > > > Claus Ibsen > > > ----------------- > > > Red Hat, Inc. > > > FuseSource is now part of Red Hat > > > Email: cib...@redhat.com > > > Web: http://fusesource.com > > > Twitter: davsclaus > > > Blog: http://davsclaus.com > > > Author of Camel in Action: http://www.manning.com/ibsen > > > > > >