2017-04-06 64 views
1

我需要實現一個批處理作業,該作業拆分XML,處理部件並在之後進行聚合。總量需要進一步處理。如何使用Spring批次正確聚合和拆分作業

帳戶部分的處理非常昂貴。在下面的圖片中,處理部分爲一個人的每個賬戶採取行動(一個人的賬戶數量隨機變化)。

structure of the XML

樣品輸入文件:

<?xml version="1.0" encoding="UTF-8"?> 
<Persons> 
    <Person> 
     <Name>Max Mustermann</Name> 
     <Accounts> 
      <Account>maxmustermann</Account> 
      <Account>esel</Account> 
      <Account>affe</Account> 
     </Accounts> 
    </Person> 
    <Person> 
     <Name>Petra Pux</Name> 
     <Accounts> 
      <Account>petty</Account> 
      <Account>petra</Account> 
     </Accounts> 
    </Person> 
     <Person> 
     <Name>Einsiedler Bob</Name> 
     <Accounts> 
      <Account>bob</Account> 
     </Accounts> 
    </Person> 
</Persons> 

每個人的每個帳戶執行以下操作: 調用REST服務,例如說

GET /帳號/ {個人}/{account}/logins

As result爲包含聚集登錄的每個Person調用一個休息服務-xml:

POST /分析/登錄/ {}人

<Person> 
    <Name>Max Mustermann</Name> 
    <Accounts> 
     <Account> 
      <LoginCount>22</LoginCount> 
      <Name>maxmustermann</Name> 
     </Account> 
     <Account> 
      <LoginCount>42</LoginCount> 
      <Name>esel</Name> 
     </Account> 
     <Account> 
      <LoginCount>13</LoginCount> 
      <Name>affe</Name> 
     </Account> 
    </Accounts> 
</Person> 

我沒有對API的任何影響,所以我需要更新的人捆綁。

我如何才能實現並行化,從而構建我的彈簧批處理應用程序?

我發現了一些起點,但沒有一個真正令人滿意。

我應該處理一步到位的帳戶數據,歸還屬於在每個項目的下一個步驟每一個帳戶,調查項目和聚合這些或者我應該在帳戶步實現並行化和聚合它這個步驟中,引入下一步進一步處理?

第一種方法存在問題:我應該如何知道所有物品已到達才能開始聚合?

第二種方法存在的問題(或者有問題):是否常常手動實現並行(例如Java未來)而不是將其留給Spring批處理?

什麼是春季批發種方式?

謝謝,托馬斯

+0

so output is xml? –

+0

Hi Sabir, 是它的XML。 – thomas

回答

1

你有沒有像你的問題解釋很多東西 - 你的出發點,爲什麼是那些不盡如人意?

此外,您應該已經顯示了一個示例輸入和輸出xml。你的最後一段很難理解,因此請仔細閱讀&。

說了這麼多,我想在Java中的條款,您有List<Person>型,其中Person就像是輸入 -

public class Person{ private List<Account> accounts; .... .... }

我還是不知道你想要的輸出和不知道你是什麼意思通過聚合?

請解釋這些問題,我會修改我的答案。

據我瞭解有關聚合要求,Spring批處理已經寫入,以便部分應該已經被照顧而沒有任何明確的聚合。

如果我明白你的輸入結構和處理程序必須正確,你應該利用Spring Batch Partitioning,你分區或者您的List<Person>(這是讀取XML記錄),或者你可以直接分區上的XML(Using split command and SystemCommandTasklet),或者你可以把你的XML爲多個較小的XML,並可以使用MultiResourcePartitioner

它沒有必要開始一氣呵成的所有分區的步驟,您可以通過使用TaskExecutorconcurrencyLimit開始一小羣的分區步驟並行。

各種策略可以算出寫由多個線程單個文件或書面形式向被多個線程等多個文件

標準Spring Batch的辦法是在y中的並行線程者的兩個讀x個(即每個線程有x個人),並行處理每個人,然後以塊的形式寫入單個目標或多個目標。

將總人員分爲N個分區,爲每個人調用ItemProcessor中的REST服務,並準備處理器中的目標Person對象。所需輸出人數將作爲chunk-size設置發送給作家。在步驟@StepScope中標記從屬步驟組件ItemReader,ItemProcessorItemWriter,並且每個從屬步驟將在其自己的線程中運行。

希望它有幫助,並讓我知道你面臨的具體挑戰。