Мне поручено создать маршрут Camel с использованием Camel версии 2.20.0, который берет строку из 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 ...