使用Apache Camel迁移MongoDB集合数据失败,请求排查配置问题
解决Apache Camel MongoDB消费者端点的IllegalArgumentException问题
你这是踩了Camel MongoDB组件的一个常见配置坑——把生产者专属的参数硬塞到了消费者端点里,这就是触发java.lang.IllegalArgumentException的原因,毕竟operation、writeConcern这类参数本来就不属于读取数据的消费者端点。
问题根源
Camel的MongoDB组件对消费者(负责读取数据的端点)和生产者(负责写入数据的端点)的可用参数做了明确区分:
operation、writeConcern、dynamicity这类参数是给生产者端点用的,用来控制写入行为;- 你用来读取数据的
SOURCE属于消费者端点,根本不需要这些参数,强行配置自然会报错。
解决方案
把参数拆分到对应的端点:消费者端点只保留读取所需的基础配置,写入用的生产者端点再添加专属参数。
1. 修正源端点(SOURCE)配置
移除所有生产者专属参数,只保留连接、数据库、集合这些必要项:
private static final String SOURCE = "mongodb:myDb?database=email_response&collection=emailResponse";
如果需要自定义读取的查询条件,用消费者专属的consumer.query参数,比如只读取状态为processed的数据:
private static final String SOURCE = "mongodb:myDb?database=email_response&collection=emailResponse&consumer.query={status:'processed'}";
2. 配置目标端点(写入到另一个集合)
把原来的operation、writeConcern等参数放到写入用的生产者端点里,比如:
private static final String TARGET = "mongodb:myDb?database=email_response&collection=targetEmailCollection&operation=insert&writeConcern=ACKNOWLEDGED&dynamicity=true";
3. 完整路由示例
把修正后的端点组合成路由,实现从源集合读取、写入到目标集合:
from(SOURCE) // 这里可以添加数据转换、过滤等处理逻辑(如果需要的话) .to(TARGET);
额外说明
operation=findAll其实是多余的,Camel MongoDB消费者默认就是读取集合中的数据(基于轮询或变更流,取决于组件版本);- 如果需要更复杂的读取逻辑(比如分页、排序),可以用
consumer.query配合MongoDB的查询语法实现,或者在路由中添加处理器进行二次过滤。
内容的提问来源于stack exchange,提问作者Shamim Ahmad
相关产品推荐
相关产品推荐

