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 <[email protected]> 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
> <[email protected]> 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 <[email protected]>:
>>
>>> 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: [email protected]
> Twitter: davsclaus
> Blog: http://davsclaus.com
> Author of Camel in Action: http://www.manning.com/ibsen
> hawtio: http://hawt.io/
> fabric8: http://fabric8.io/