Apache camel 使用ApacheCamel同步两个表
我刚刚开始使用ApacheCamel,我想尝试同步两个表。两个表都有两列,“id”和“name”。该场景将查询第一个表,检查第二个表中是否存在每条记录,并插入不存在的每条记录。以下是我的尝试: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
<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,我做了“插入…在冲突中执行更新集…”。