Apache Camel:构建XML解析批处理的正确方法?
问题描述:
我想编写一个骆驼批:Apache Camel:构建XML解析批处理的正确方法?
- 过程的特定目录内,每个文件中的所有文件:
- 验证XML与XSD架构
- 和解组不同的部分和处理数据
- 没有停止对异常
- 如果发生至少一个错误,将失败dirrectory末,移动到完成,否则
的困难,我遇到:
- 文件组件允许自动移动上完成文件/失败目录,但只要你使用分流/聚合器,该文件是 总是在做,唐迁甚至不会等待聚合完成。
- 管理的例外是不直观
- 斯普利特和aggretors是噩梦并没有在文档足够的“现实世界”的例子
- 复杂结构的XML标记化给我们带来了一些超出理解
当然,我遇到这些问题,因为我是新来的Apache骆驼:)
的什么,我试图做的想法:
- 文件组件(OK)
- XSD验证(好吧,如果错误,文件部件移动到失败)
- 做出了破裂/多播读取XML,当出现错误时,我们忽略了的异常,保持头错误,并继续(不是真的好,我可以读,但不管理正确地聚合)
- 我们汇总(其实没什么可聚集, 我们只是要检查所有的头)
- 如果错误,我们明确将 移至失败的目录
简化XML这个例子:
<root>
<library></library>
<books year="2015">
<book></book>
<book></book>
... many
</books>
<books year="2016">
<book></book>
<book></book>
... many
</books>
... many years
</root>
你将如何构建批次这样的XML? 此外,让我们假设你必须先阅读“库”(并使用管道)。此外,在头(布尔)保存错误的想法是好的?
注意:特别感谢克劳斯·易卜生对SO的许多骆驼帖子作出回应,但也请尽量不要在Apache Camel文档中给出一个简单的链接:)对于新手来说,Apache Camel文档sux是真的。
谢谢
答
你读过“骆驼在行动”一书吗?
这可以归结为您的XML有多大。如果文件足够“小”(小取决于你有多少RAM),则不需要对它们进行流式处理。
我就开始这样的路线:
- 验证XML(见How can I validate xsd using apache camel?)
- 解组到Java对象
- 过程
<library>
值 - 拆分对每本书(基本上是
for
循环) - 处理每本书,如果发生异常,则在某个标题中“记住”
- 拆分后,如果发生了例外然后再提高它使文件组件将移到失败文件夹
例(未测试的代码):
<route>
<from uri="file:yourInputDir" />
<to uri="validator:file:books/schema.xsd"/>
<unmarshal>
<jaxb contextPath="package.of.your.java.pojo" />
</unmarshal>
<to uri="bean:libraryProcessor" />
<split strategyRef="saveExceptionInHeader">
<simple>${body.getBooksList}</simple>
<doTry>
<to uri="bean:processBooks" />
<doCatch>
<exception>java.lang.Exception</exception>
<setHeader headerName="RemeberLastException">
<simple>${exception}</simple>
</setHeader>
</doCatch>
</doTry>
</split>
<to uri="bean:throwExceptionIfRemeberLastExceptionHeaderPresent" />
</route>
每个bean的名字表明它做什么,实施它不应该是一项艰巨的任务。
添加很多的日志语句,以获得有关骆驼做什么的一些反馈。
想法恰恰是不加载全部在内存中一次,但使用SAX解析和部分解组:) – user2668735
@ user2668765使用'streaming'分路器与XML标记生成器,然后解组的单个对象。请参阅http://www.davsclaus.com/2011/11/splitting-big-xml-files-with-apache.html –
谢谢您,但是您的链接显示了一个太基本(并且太旧)的示例。最初的需求可能包括多播和嵌套分离器/聚合器。我真的期望看到几乎确切的答案。我们完全没有在所有的互联网上找到关于“如何解析XML”与Apache Camel,我的意思是,至少复杂的XML是疯狂的。我很快在骆驼行动中搜索,总是一样的:没有现实生活中的例子。 – user2668735