2017-08-08 68 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