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
相关产品推荐
相关产品推荐

