1

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

2 に答える 2