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 ...