You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Apache Camel使用split、stax、JAXB拆分大XML文件输出异常咨询

问题核心原因

你配置的StAX拆分器参数错误,当前传入的是根节点对应的PartRecords.class,拆分器会将整个<data>节点一次性解析为包含全量记录列表的PartRecords对象,整个列表只会作为一个拆分单元执行后续逻辑,因此最终只会投递一条包含全量数据的消息。

解决方案

直接调整Camel路由中StAX拆分器的参数为单个记录对应的PartRecord.class即可,无需保留PartRecords封装类:

from("sftp:localhost:22/in")
   .split(stax(PartRecord.class)).streaming()
   .marshal().json(JsonLibrary.Jackson, true)
   .to("rabbitmq://rabbitmq:5672/myExchange?queue=partQueue&routingKey=queue.part")
   .end();

生效逻辑

PartRecord类上已经配置了@XmlRootElement(name = "PRODUCTNUMBER")注解,StAX拆分器会流式遍历XML中所有的<PRODUCTNUMBER>节点,逐个映射为PartRecord对象,每个对象会单独执行后续的序列化、投递到队列的逻辑。

调整后你的示例文件会生成2条独立的队列消息,单条消息格式如下:

{
  "productNumber" : "8D0201075E",
  "currentPrice" : 427.90,
  "partDescriptionNL" : "Some description",
  "partDescriptionFR" : "Some description"
}

方案合理性说明

该流式拆分方案完全满足百万级记录的低内存处理需求,内存占用仅和单条记录大小相关,不会加载全量XML文件。单条记录对应单条消息是大数据量处理的常规方案,方便后续消费端做幂等、重试、分批持久化等操作,性能和可维护性远优于全量数据单条投递。


内容的提问来源于stack exchange,提问作者Sven

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 16:30:04