Camel配置loop的doWhile属性报SAXParseException错误如何解决
问题根因
你遇到的XML解析报错本质是语法使用错误:Apache Camel的XML DSL中doWhile属性不属于<loop>标签,是用于标记循环条件的属性,所以直接给<loop>加doWhile="true"会触发XSD schema验证失败。
另外你当前的循环内容顺序也不符合do-while的执行逻辑,do-while要求先执行一次循环体,再判断条件是否继续执行。
解决方法
如果你使用的是Camel 2.17及以上版本(支持do-while循环特性),按以下规则修改配置即可:
- 移除
<loop>标签上的doWhile="true"属性 - 将循环条件的
<simple>标签放到<loop>的第一个子节点位置,给该<simple>标签加上doWhile="true"属性 - 保留原有循环体逻辑即可
修正后的代码示例
<loop> <!-- doWhile属性加在条件simple标签上 --> <simple doWhile="true">${body} != 0</simple> <!-- 循环体内容 保留原逻辑 --> <!-- 存储B表最新的最大id --> <to uri="sql:{{export.table.b.last.fetched.id.query}}?dataSource=testDataSource&outputType=SelectOne" /> <setHeader headerName="last_fetched_id"> <simple>${body}</simple> </setHeader> <!-- 基于最新id从A表取500条插入B表,返回插入行数 --> <to uri="sql:{{export.table.a.insert.fetch.query}}?dataSource=testDataSource" /> </loop>
补充注意事项
如果你的Camel版本低于2.17不支持do-while特性,可以改用路由递归的方式实现相同逻辑:单独定义执行插入的子路由,插入完成后判断行数如果不为0就再次调用自身路由即可。
内容的提问来源于stack exchange,提问作者Kate
相关产品推荐
相关产品推荐

