Apache Camel sql consumer:如何传递参数进行查询?

时间:2014-06-05 13:48:45

标签: apache-camel

假设我有一条路线:

<route>
<from uri="sql:select orderid from Orders where date = '20140606'"/>
<split>
<simple>${body}</simple>
<process ref="orderProcessor"/>
</split>
</route>

这将给我订单20140606作为清单。列表将被拆分,每个订单将由orderProcessor处理。

但是,我想将日期注入sql查询,就像

一样
select orderid from Orders where date = '${date:now:YYYYMMDD}'

这意味着我每天开始申请时都会自动更改日期。

令我惊讶的是,我发现当“sql”端点用作Consumer时,这是不可能的。如果sql用作Producer,我可以将参数作为标头传递,但不能作为Consumer。或者我错了,这是可能的吗?

顺便说一下,我更倾向于使用“sql”作为消费者,因为它方便地允许在使用选项“consumer.onConsume”检索的每一行上执行和更新查询(参见:https://camel.apache.org/sql-component.html)。

1 个答案:

答案 0 :(得分:4)

消费者端点(from)是静态的,这就是${date:now:yyyyMMdd}无效的原因。

使用Java DSL,您可以灵活地使用它:

String today = new SimpleDateFormat("yyyyMMdd").format(new Date());
from("sql:select orderid from Orders where date = '" + today + '")
    .split(...);

或使用生产者端点(to):

<from uri="direct:start" />
<setHeader headerName="today"><simple>${date:now:yyyyMMdd}</simple></setHeader>
<to uri="sql:select orderid from Orders where date = :#today" />
<split>
    <simple>${body}</simple>
    <process ref="orderProcessor"/>
</split>

修改 或者,您可以使用DB特定的日期函数。使用Oracle DB就像这样:

<from uri="sql:select orderid from Orders where date = to_date(to_char(current_date),'dd-mon-yy')" />