Apache Camel如何路由和转换XML消息

15次阅读

apache Camel 处理 xml 消息的核心是串联“来源→判断→拆解→改写→投递”环节,支持 XPath 路由、splitter 拆分聚合、JAXB/XSLT/XMLjsON 转换,并可与 FTP/JMS 等端点无缝集成。

Apache Camel如何路由和转换XML消息

Apache Camel 路由和转换 XML 消息,核心在于把“消息从哪来、怎么判断、如何拆解、怎样改写、发到哪去”这几个环节串起来。它不强制你用某一种方式,而是提供灵活的组件组合——比如用 from 接入 XML 源,用 split/xpath 拆结构,用 jaxb/xslt 做格式转换,再用 to 发送到目标端点。

XML 消息的路由:按内容或结构分发

Camel 支持基于 XML 内容做条件路由,常用的是 XPath 表达式配合 choice()Filter()

  • xpath("//order/@priority = 'high'") 判断是否高优先级订单,走快速通道;
  • xpath("count(//item) > 10") 统计商品数量,超量订单转人工审核;
  • filter(xpath("//status = 'draft'")) 只让草稿状态的消息继续流转,其他直接丢弃。

这类路由完全解耦业务逻辑与传输协议——无论 XML 来自 FTP、http 还是 activemq,只要能解析,就能统一处理。

XML 消息的拆分与聚合

当一个 XML 文件包含多个业务单元(如一份订单含多个子项),可用 splitter 拆成独立消息分别处理:

  • split(xpath("//order/items/item")) 提取每个 元素作为一条新消息;
  • 拆分后可并行调用校验服务、库存查询等,再用 aggregate() 按订单 ID 合并结果;
  • 注意默认是浅拷贝,若需修改每条子消息的 header 或 body,应加 onPrepare(...) 创建深拷贝。

XML 格式转换:对象 ↔ XML ↔ json

Camel 提供多套成熟方案适配不同转换场景:

  • JAXB:适合有固定 XSD 的 XML,自动绑定 java 类,用 marshal().jaxb(MyOrder.class)unmarshal().jaxb()
  • XSLT:做结构重排或字段映射,比如把旧版订单 XML 映射为新版字段名,只需配置 transform().xslt("order-v1-to-v2.xsl")
  • XMLJSON:轻量级互转,适合对外提供 REST 接口时,用 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 自动协调生命周期与错误恢复。

text=ZqhQzanResources