Apache camel 使用ApacheCamel同步两个表

Apache camel 使用ApacheCamel同步两个表,apache-camel,Apache Camel,我刚刚开始使用ApacheCamel,我想尝试同步两个表。两个表都有两列,“id”和“name”。该场景将查询第一个表,检查第二个表中是否存在每条记录,并插入不存在的每条记录。以下是我的尝试: <camel:camelContext id="test"> <camel:route> <camel:from uri="timer://kickoff?period=5s"/> <camel:to uri="sql:se

我刚刚开始使用ApacheCamel,我想尝试同步两个表。两个表都有两列,“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>

身体
${header.CamelSqlRowCount}==0

这里的问题是,当我到达
insert into table2
时,原始消息(包含数据的消息)丢失了,因为我必须同时进行另一个查询(在第二个表中检查数据)。我的方法好吗?如何检索包含数据的消息?

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

<header name="myresults"><simply>$body</simple></header>
$body

调用第二个SQL进行检查时,可以使用content enricher EIP将此调用的结果与原始消息“合并”。在您的例子中,您只需要知道是否有行,并将其存储在标题中

此处记录了content enricher eip:,请参见enrich示例

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

您还可以按照Ben的建议将第一个数据存储在头(或exchange上的属性)中,您可以稍后访问该头


虽然从EIP的角度来看这一点,但最能涵盖此用例的是content enricher EIP。

您也可以避免此问题,并使用某种特定于数据库的语句来执行插入

例如,对于mysql,您可以执行以下操作

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

我相信其他数据库引擎也有类似的功能。它可以为您保存一些对数据库的查询。

这对我很有帮助。对于Postgresql,我做了“插入…在冲突中执行更新集…”。