我的任务是使用 Camel 版本 2.20.0 创建一个 Camel 路由,该路由从 CSV 文件中获取一行,在 SQL 语句 where 子句中使用该行中的一个值,并合并结果并再次输出它们。如果我在 SQL 语句中对标识符进行硬编码,它可以正常工作,如果我尝试使用动态 URI,我会收到错误消息。
路线是:
from("file:///tmp?fileName=test.csv")
.split()
.tokenize("\n")
.streaming()
.parallelProcessing(true)
.setHeader("userID", constant("1001"))
//.enrich("sql:select emplid,name from employees where emplid = '1001'",
.enrich("sql:select name from employees where emplid = :#userID",
new AggregationStrategy() {
public Exchange aggregate(Exchange oldExchange,
Exchange newExchange) {...
正如我所说,如果我取消注释带有硬编码 1001 的行,它会查询数据库并按预期工作。但是使用 ':#userID' 语法我得到一个 Oracle 错误:
java.sql.SQLSyntaxErrorException: ORA-00942: table or view does not exist
Message History
---------------------------------------------------------------------------------------------------------------------------------------
RouteId ProcessorId Processor Elapsed (ms)
[route3 ] [route3 ] [file:///tmp?fileName=test.csv ] [ 43]
[route3 ] [log5 ] [log ] [ 2]
[route3 ] [setHeader2 ] [setHeader[userID] ] [ 0]
[route3 ] [enrich2 ] [enrich[constant{sql:select name from employees where emplid = :#userID] [ 40]
该表显然在那里,因为它在值被硬编码时工作,因此它与传递动态值有关。我已经尝试了很多关于如何在单引号内传递该变量的变体,使用来自正文而不是标题的值等,但还没有找到有效的组合,尽管我已经看到了很多类似的看似有效的例子.
我打开了跟踪它似乎标题也正确设置:
o.a.camel.processor.interceptor.Tracer : >>> (route3) setHeader[userID, 1001] --> enrich[constant{sql:select name from employees where emplid = :#userID}] <<< Pattern:InOnly, Headers:{CamelFileAbsolute=true, CamelFileAbsolutePath=/tmp/test.csv, CamelFileLastModified=1513116018000, CamelFileLength=26, CamelFileName=test.csv, CamelFileNameConsumed=test.csv, CamelFileNameOnly=test.csv, CamelFileParent=/tmp, CamelFilePath=/tmp/test.csv, CamelFileRelativePath=test.csv, userID=1001}, BodyType:String, Body:1001,SomeValue,MoreValues
需要改变什么才能使这项工作有效?
我还应该注意我已经尝试过这种方法,使用各种语法选项来引用标头值,但没有任何运气:
.enrich().simple("sql:select * from employees where emplid = :#${in.header.userID}").aggregate ...