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 <[email protected]>
> 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" <[email protected]>
> 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 <[email protected]>
> >
> > > On Thu, Mar 7, 2013 at 8:03 AM, Jean Francois LE BESCONT
> > > <[email protected]> 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 <[email protected]>
> > > >
> > > >> 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 <[email protected]>
> > > >>
> > > >>> Thanks Claus !
> > > >>>
> > > >>> Tricky but it works :)
> > > >>>
> > > >>>
> > > >>> 2013/3/6 Claus Ibsen <[email protected]>
> > > >>>
> > > >>>> On Wed, Mar 6, 2013 at 1:05 PM, Jean Francois LE BESCONT
> > > >>>> <[email protected]> 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 <[email protected]>
> > > >>>> >
> > > >>>> >> 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 <[email protected]>
> > > >>>> >>
> > > >>>> >>> On Wed, Mar 6, 2013 at 10:26 AM, Jean Francois LE BESCONT
> > > >>>> >>> <[email protected]> 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 <[email protected]>
> > > >>>> >>> >
> > > >>>> >>> >> 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 <[email protected]>
> > > >>>> >>> >>
> > > >>>> >>> >>> 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 <[email protected]>
> > > >>>> >>> >>>
> > > >>>> >>> >>>> 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 <[email protected]
> >
> > > >>>> >>> >>>>
> > > >>>> >>> >>>>> 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 <[email protected]>
> > > >>>> >>> >>>>>
> > > >>>> >>> >>>>>> 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: [email protected]
> > > >>>> >>> 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: [email protected]
> > > >>>> 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: [email protected]
> > > Web: http://fusesource.com
> > > Twitter: davsclaus
> > > Blog: http://davsclaus.com
> > > Author of Camel in Action: http://www.manning.com/ibsen
> > >
> >
>