1

我正在尝试编写骆驼批处理:

  • 处理特定目录中的所有文件以及每个文件:
  • 使用 XSD 架构验证 XML
  • 解组不同的零件和过程数据
  • 不要停止异常
  • 如果发生至少一个错误,则移至最后失败的目录,否则移至完成

我遇到的困难:

  • 文件组件允许在完成/失败目录上自动移动文件,但是一旦您使用拆分/聚合器,文件总是移动到完成,甚至不等待聚合完成。
  • 管理异常并不直观
  • 拆分和聚合器是噩梦,文档中没有足够的“真实世界”示例
  • 复杂结构上的 XML 标记化使我们无法理解

当然,我遇到这些问题是因为我是 Apache Camel 的新手 :)

我想做的事情的想法:

  1. 文件组件(好的)
  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 构造批处理? 此外,假设您必须先阅读“库”(并使用管道)。另外,在标题(布尔)中保存错误的想法好吗?

注意:特别感谢克劳斯·易卜生(Claus Ibsen)回复了许多关于 SO 的 Camel 帖子,但也请尽量不要只提供 Apache Camel 文档上的简单链接 :) 真的,对于新手来说,Apache Camel 文档 sux。

谢谢

4

1 回答 1

0

你读过《骆驼行动》这本书吗?

这归结为您的 XML 有多大。如果文件足够“小”(其中小取决于您拥有多少 RAM),则不需要流式传输它们。

我将从这样的路线开始:

  1. 验证 XML(请参阅如何使用 apache camel 验证 xsd?
  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 的名称都暗示了它的作用,实现它应该不是一项艰巨的任务。

添加大量日志语句以获取有关 Camel 所做工作的一些反馈。

于 2017-08-22T14:03:22.350 回答