假设我有一条路线:
<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)。答案 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')" />