Apache Camel 处理 XML 消息的核心是串联“来源→判断→拆解→改写→投递”环节,支持 XPath 路由、splitter 拆分聚合、JAXB/XSLT/XMLJSON 转换,并可与 FTP/JMS 等端点无缝集成。
Apache Camel 路由和转换 XML 消息,核心在于把“消息从哪来、怎么判断、如何拆解、怎样改写、发到哪去”这几个环节串起来。它不强制你用某一种方式,而是提供灵活的组件组合——比如用 from 接入 XML 源,用 split/xpath 拆结构,用 jaxb/xslt 做格式转换,再用 to 发送到目标端点。
Camel 支持基于 XML 内容做条件路由,常用的是 XPath 表达式配合 choice() 或 filter():
xpath("//order/@priority = 'high'") 判断是否高优先级订单,走快速通道;xpath("count(//item) > 10") 统计商品数量,超量订单转人工审核;filter(xpath("//status = 'draft'")) 只让草稿状态的消息继续流转,其他直接丢弃。这类路由完全解耦业务逻辑与传输协议——无论 XML 来自 FTP、HTTP 还是 ActiveMQ,只要能解析,就能统一处理。
当一个 XML 文件包含多个业务单元(如一份订单含多个子项),可用 splitter 拆成独立消息分别处理:
split(xpath("//order/items/item")) 提取每个 元素作为一条新消息;aggregate() 按订单 ID 合并结果;onPrepare(...) 创建深拷贝。Camel 提供多套成熟方案适配不同转换场景:
marshal().jaxb(MyOrder.class) 或 unmarshal().jaxb();
transform().xslt("order-v1-to-v2.xsl");transform().xmljson() 把入参 XML 转成 JSON 交给下游微服务。真实流程中,XML 处理常嵌在完整链路里。例如从 FTP 下载 XML 订单,校验后转成 JMS 消息:
from("ftp://host/orders?username=u&password=p&fileName=*.xml") —— 拉取文件;.split(xpath("//order")).filter(xpath("@valid='true'")) —— 拆单+过滤;.unmarshal().jaxb(Order.class).process(new ValidateProcessor()) —— 解析+校验;.marshal().json(JsonLibrary.Jackson).to("jms:queue:processedOrders") —— 转 JSON 并投递。整个过程无需手写 XML 解析器,也不用管理连接池或事务边界,Camel 自动协调生命周期与错误恢复。