0

Apache Camelを使い始めたばかりで、2つのテーブルを同期させたいと思います。どちらのテーブルにも、「id」と「name」の2つの列があります。このシナリオでは、最初のテーブルを照会し、2番目のテーブルに各レコードが存在するかどうかを確認し、存在しない各レコードを挿入します。これが私の試みです:

<camel:camelContext id="test">
    <camel:route>
        <camel:from uri="timer://kickoff?period=5s"/>
        <camel:to uri="sql:select id, name from table1?dataSourceRef=dataSource"/>
        <camel:split>
            <camel:simple>body</camel:simple>
            <camel:to uri="sql:select * from table2 where id = #?dataSourceRef=dataSource" />
            <camel:choice>
                <camel:when>
                    <camel:simple>${header.CamelSqlRowCount} == 0</camel:simple>
                    <camel:to uri="sql:insert into table2 (id, name) values (#, #)?dataSourceRef=dataSource" />
                </camel:when>
            </camel:choice>
            <camel:to uri="mock:result" />
        </camel:split>
    </camel:route>
</camel:camelContext>

ここでの問題は、に到達するまでinsert into table2に、元のメッセージ(データを含むメッセージ)が失われることです。その間に別のクエリを実行する必要があったためです(2番目のテーブルのデータをチェックします)。私のアプローチは優れていますか?データを含むメッセージを取得するにはどうすればよいですか?

4

3 に答える 3

3

2 番目の SQL を呼び出して確認すると、コンテンツ エンリッチャー EIP を使用して、この呼び出しの結果を元のメッセージと「マージ」できます。あなたの場合、行があったかどうかを知り、それをヘッダーに保存するだけで済みます。

コンテンツ エンリッチャーの eip は、http://camel.apache.org/content-enricher.html に記載されていますたとえば、enricher を参照してください。

注意点は、Java コードを使用し、「マージ」ロジックを実装する AggregationStrategy を実装する必要があることです。

Ben が提案するように、最初のデータをヘッダー (または交換のプロパティ) に保存することもできます。これは後でアクセスできます。

これを EIP の観点から見ると、このユースケースを最もよくカバーするのはコンテンツ エンリッチャー EIP です。

于 2012-12-29T09:02:31.410 に答える
2

最初のクエリの結果をヘッダー フィールドに保持する必要があるため、2 番目のクエリの本文をセットアップするときに失われません。

<header name="myresults"><simply>$body</simple></header>
于 2012-12-29T06:18:37.230 に答える