2017-08-08 185 views
1

我想编写一个骆驼批:Apache Camel:构建XML解析批处理的正确方法?

  • 过程的特定目录内,每个文件中的所有文件:
  • 验证XML与XSD架构
  • 和解组不同的部分和处理数据
  • 没有停止对异常
  • 如果发生至少一个错误,将失败dirrectory末,移动到完成,否则

的困难,我遇到:

  • 文件组件允许自动移动上完成文件/失败目录,但只要你使用分流/聚合器,该文件是 总是在做,唐迁甚至不会等待聚合完成。
  • 管理的例外是不直观
  • 斯普利特和aggretors是噩梦并没有在文档足够的“现实世界”的例子
  • 复杂结构的XML标记化给我们带来了一些超出理解

当然,我遇到这些问题,因为我是新来的Apache骆驼:)

的什么,我试图做的想法:

  1. 文件组件(OK)
  2. XSD验证(好吧,如果错误,文件部件移动到失败)
  3. 做出了破裂/多播读取XML,当出现错误时,我们忽略了的异常,保持头错误,并继续(不是真的好,我可以读,但不管理正确地聚合)
  4. 我们汇总(其实没什么可聚集, 我们只是要检查所有的头)
  5. 如果错误,我们明确将 移至失败的目录

简化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是真的。

谢谢

回答

0

你读过“骆驼在行动”一书吗?

这可以归结为您的XML有多大。如果文件足够“小”(小取决于你有多少RAM),则不需要对它们进行流式处理。

我就开始这样的路线:

  1. 验证XML(见How can I validate xsd using apache camel?
  2. 解组到Java对象
  3. 过程<library>
  4. 拆分对每本书(基本上是for循环)
  5. 处理每本书,如果发生异常,则在某个标题中“记住”
  6. 拆分后,如果发生了例外然后再提高它使文件组件将移到失败文件夹

例(未测试的代码):

<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的名字表明它做什么,实施它不应该是一项艰巨的任务。

添加很多的日志语句,以获得有关骆驼做什么的一些反馈。

+0

想法恰恰是不加载全部在内存中一次,但使用SAX解析和部分解组:) – user2668735

+0

@ user2668765使用'streaming'分路器与XML标记生成器,然后解组的单个对象。请参阅http://www.davsclaus.com/2011/11/splitting-big-xml-files-with-apache.html –

+1

谢谢您,但是您的链接显示了一个太基本(并且太旧)的示例。最初的需求可能包括多播和嵌套分离器/聚合器。我真的期望看到几乎确切的答案。我们完全没有在所有的互联网上找到关于“如何解析XML”与Apache Camel,我的意思是,至少复杂的XML是疯狂的。我很快在骆驼行动中搜索,总是一样的:没有现实生活中的例子。 – user2668735