0

我刚开始使用 Apache Camel,我想尝试同步两个表。两个表都有两列,“id”和“name”。该方案将查询第一个表,检查第二个表中的每条记录是否存在,并插入每条不存在的记录。这是我的尝试:

<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时,原始消息(包含数据的消息)丢失了,因为我必须同时进行另一个查询(我在第二个表中检查数据)。我的方法好吗?如何检索包含数据的消息?

4

3 回答 3

3

当您调用第二条 SQL 进行检查时,您可以使用内容丰富器 EIP 将本次调用的结果与原始消息“合并”。在您的情况下,您只需要知道是否有一行,并将其存储在标题中。

内容丰富器 eip 记录在此处:http://camel.apache.org/content-enricher.html,例如参见丰富。

需要注意的是,您需要使用 java 代码并实现一个 AggregationStrategy 来实现“合并”逻辑。

您也可以按照 Ben 的建议将第一个数据存储在标头(或交易所的属性)中,以后可以访问。

尽管从 EIP 的角度来看,它是最能涵盖此用例的内容丰富 EIP。

于 2012-12-29T09:02:31.410 回答
2

您需要将第一个查询的结果保留在标题字段中,以便在为第二个查询设置正文时不会丢失

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

您还可以避免该问题并使用某种特定于数据库的语句来进行插入。

例如,对于 mysql,您可以执行类似的操作

INSERT IGNORE table2 (id, name) values (#, #)

我确信其他数据库引擎也有类似的东西。它为您节省了一些对数据库的查询。

于 2012-12-30T19:42:53.957 回答