Camel FTP路由调用删除API后如何保留原FTP入站数据?
解决Camel FTP路由调用删除API后原始数据丢失的问题
问题背景
现有Camel FTP路由可正常处理入站文本文件,调用公司API将数据加载至内部Company表。现在需要在FTP路由触发时先调用删除API清空Company表,但删除API返回的操作信息会覆盖原FTP入站数据,导致后续加载API无法获取原始数据。当前路由代码如下:
<route id="import-data-from-ftp"> <from uri="ftp:............................."/> <!-- Step 1 --> <to uri="api:deleteData............................."/> <!-- Step 2 --> <to uri="api:loadData............................."/> <!-- Step 3 --> </route>
可行实现方法
方法1:将原始数据存入Exchange属性后恢复
在调用删除API前,把FTP传入的原始数据保存到Exchange的属性中,调用完删除API后再将属性中的数据恢复到消息体,这样原始数据不会被覆盖。修改后的路由代码:
<route id="import-data-from-ftp"> <from uri="ftp:............................."/> <!-- Step 1 --> <!-- 保存原始FTP数据到Exchange属性 --> <setProperty propertyName="OriginalFtpContent"> <simple>${body}</simple> </setProperty> <!-- 调用删除API,此时消息体被替换为删除结果 --> <to uri="api:deleteData............................."/> <!-- Step 2 --> <!-- 把保存的原始数据恢复到消息体 --> <setBody> <simple>${exchangeProperty.OriginalFtpContent}</simple> </setBody> <!-- 调用加载API,使用原始FTP数据 --> <to uri="api:loadData............................."/> <!-- Step 3 --> </route>
方法2:使用enrich组件同步调用并保留原始消息
enrich组件支持同步调用外部服务(删除API),但默认会保留原始的消息体,仅将调用结果存入指定的Header或Property中,无需手动恢复数据。示例代码:
<route id="import-data-from-ftp"> <from uri="ftp:............................."/> <!-- Step 1 --> <!-- 调用删除API,将返回结果存入DeleteResult Header,原始body保持不变 --> <enrich uri="api:deleteData............................."> <headerFilterStrategy> <include>DeleteResult</include> </headerFilterStrategy> </enrich> <!-- 直接调用加载API,使用原始FTP数据 --> <to uri="api:loadData............................."/> <!-- Step 3 --> </route>
注:如果不需要保留删除API的返回结果,也可以简化
enrich的配置,只指定调用URI即可。
方法3:异步调用删除API(无需等待结果场景)
如果删除API的执行不需要同步等待完成即可启动加载流程,可以使用wireTap异步调用删除API,主流程直接使用原始FTP数据执行加载操作,完全避免消息体被覆盖。示例代码:
<route id="import-data-from-ftp"> <from uri="ftp:............................."/> <!-- Step 1 --> <!-- 异步调用删除API,不阻塞主流程 --> <wireTap uri="api:deleteData............................."/> <!-- 直接调用加载API,使用原始FTP数据 --> <to uri="api:loadData............................."/> <!-- Step 3 --> </route>
注意:此方法适用于删除操作不影响加载逻辑的场景,比如删除操作是异步执行且无需确认结果。
内容的提问来源于stack exchange,提问作者R M
相关产品推荐
相关产品推荐

