Hi

Ah dataSource=:#dataSource should just be #dataSource, eg as its a
regular lookup in the registry. See more at
http://camel.apache.org/how-do-i-configure-endpoints.html

Its only the SQL component that has that special :#key for the SQL
placeholders (eg with a colon).


On Mon, Jun 9, 2014 at 7:34 PM, Matt Raible <m...@raibledesigns.com> wrote:
> Thanks for the advice. I've tried to implement this. Here's what my code 
> looks like:
>
> from("direct:lookup")
>     .process(new Processor() {
>         public void process(Exchange exchange) throws Exception {
>                 MemberRequest request = 
> exchange.getIn().getBody(MemberRequest.class);
>                 String client = request.getClient();
>                 String memberId = request.getMemberId();
>                 String dataSourceName = "";
>                 switch (client) {
>                         case "client1":
>                                 dataSourceName = "dsforclient1";
>                                 break;
>                         case "client2":
>                                 dataSourceName = "dsforclient2";
>                                 break;
>                         default:
>                                 // todo: propagate to error
>                 }
>                 exchange.getOut().setHeader("dataSource", dataSourceName);
>                 exchange.getOut().setHeader("memberId", memberId);
>         }
>     })
> .recipientList(simple("sql:SELECT MEMBER_ID, ADDRESS1, ADDRESS2, ADDRESS3, " +
>         "COLUMN1, COLUMN2, COLUMN3, COLUMN4, COLUMN5, COLUMN6, COLUMN7, 
> COLUMN8, COLUMN9, COLUMN10, " +
>         "COLUMN11, COLUMN12, COLUMN13, COLUMN14, COLUMN15, COLUMN16, 
> COLUMN17, COLUMN18, COLUMN19, COLUMN20 " +
>         "FROM MEMBER " +
>         "WHERE PATIENT.MEMBER_ID = :#memberId?dataSource=:#dataSource"))
> .process(new Processor() {
>         public void process(Exchange exchange) throws Exception {
>                 List<HashMap> data = (ArrayList<HashMap>) 
> exchange.getIn().getBody();
>                 List<Member> members = new ArrayList<>();
>                 for (HashMap<String, String> map : data) {
>                         Member member = new Member();
>                         member.setMemberId(map.get("MEMBER_ID"));
>                         member.setFirstName(map.get("FIRST_NAME"));
>                         members.add(member);
>                 }
>                 exchange.getOut().setBody(members.get(0));
>         }
> });
>
> Unfortunately, this results in the following error:
>
> org.apache.camel.NoSuchEndpointException: No endpoint could be found for: 
> ADDRESS1, please check your classpath contains the needed Camel component jar.
>
> I tried switching it to Antoine's recommendation, but it results in the same 
> error.
>
>     .setHeader("target", simple("sql:SELECT MEMBER_ID, ADDRESS1, ADDRESS2, 
> ADDRESS3, " +
>             "COLUMN1, COLUMN2, COLUMN3, COLUMN4, COLUMN5, COLUMN6, COLUMN7, 
> COLUMN8, COLUMN9, COLUMN10, " +
>             "COLUMN11, COLUMN12, COLUMN13, COLUMN14, COLUMN15, COLUMN16, 
> COLUMN17, COLUMN18, COLUMN19, COLUMN20 " +
>             "FROM MEMBER " +
>             "WHERE PATIENT.MEMBER_ID = :#memberId?dataSource=:#dataSource"))
>     .recipientList(header("target"))
>
>
> On Jun 8, 2014, at 1:07 AM, Claus Ibsen <claus.ib...@gmail.com> wrote:
>
>> Hi
>>
>>
>> If you se <to> then the uri is computed statically, eg once when the
>> route is initialized.
>>
>> So the "dynamic to" is a good practice for dynamic uris
>> http://camel.apache.org/how-to-use-a-dynamic-uri-in-to.html
>>
>> As you can the pass in the dataSource parameter dynamically. As well
>> construct the SQL dynamic too.
>>
>> And if you want this CASE SELECT construct in the routes as well, then
>> you can use the content based router. But having that logic in a java
>> class is maybe better.
>>
>>
>>
>> On Sat, Jun 7, 2014 at 5:31 PM, Antoine DESSAIGNE
>> <antoine.dessai...@gmail.com> wrote:
>>> Hello Matt,
>>>
>>> You'll have to use the recipient list [1] pattern:
>>>
>>> from("direct:projects")
>>>   .setProperty("ds", /* logic to convert client param to datasource name
>>> */)
>>>   .setHeader("target", simple("sql:select * from projects order by
>>> id?dataSource=${property.ds}")
>>>   .recipientList(header("target"))
>>>   .to(/* what you would do next after the SQL request */)
>>>
>>> Antoine.
>>>
>>> [1] http://camel.apache.org/recipient-list.html
>>>
>>>
>>> 2014-06-07 0:08 GMT+02:00 Matt Raible <m...@raibledesigns.com>:
>>>
>>>> Hello,
>>>>
>>>> I'm converting services written with IBM Message Broker 6.1 to Apache
>>>> Camel. Here's some of the logic I'm trying to convert:
>>>>
>>>> SET Environment.Variables.dataSource = '';
>>>> CASE UPPER(InputRoot.XMLNSC.ns:memberLookupRequest.ns:args0.ax21:Client)
>>>>        WHEN 'client1'  THEN SET Environment.Variables.dataSource = 'foo';
>>>>        WHEN 'client2'  THEN SET Environment.Variables.dataSource = 'bar';
>>>>        WHEN 'client3'          THEN SET Environment.Variables.dataSource
>>>> = 'baz';
>>>> END CASE;
>>>>
>>>> Basically, a parameter comes in and the dataSource is dynamically
>>>> configured based on it. What's the best way to do this with Apache Camel?
>>>> I'm guessing something like this might work (adopted from
>>>> http://camel.apache.org/sql-component.html):
>>>>
>>>> from("direct:projects")
>>>>  .setProperty("ds", /* logic to convert client param to datasource name
>>>> */)
>>>>  .to("sql:select * from projects order by id?dataSource=#${property.ds}")
>>>>
>>>> Is this the best way to configure dynamic datasources? For each
>>>> datasource, I realize I'll have to configure it as a @Bean with Spring's
>>>> JavaConfig.
>>>>
>>>> Thanks,
>>>>
>>>> Matt
>>
>>
>>
>> --
>> Claus Ibsen
>> -----------------
>> Red Hat, Inc.
>> Email: cib...@redhat.com
>> Twitter: davsclaus
>> Blog: http://davsclaus.com
>> Author of Camel in Action: http://www.manning.com/ibsen
>> hawtio: http://hawt.io/
>> fabric8: http://fabric8.io/
>



-- 
Claus Ibsen
-----------------
Red Hat, Inc.
Email: cib...@redhat.com
Twitter: davsclaus
Blog: http://davsclaus.com
Author of Camel in Action: http://www.manning.com/ibsen
hawtio: http://hawt.io/
fabric8: http://fabric8.io/

Reply via email to