I have found a solution I will post a whole example when every thing will work in my project.
2013/3/7 Jean Francois LE BESCONT <jflebesc...@gmail.com> > 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 >> > > >> > >> > >