2012-03-01 94 views
2

我使用Spring Batch從Wikipedia XML轉儲文件(單個30多個gig文件)中提取一些數據。我使用StaxEventItemReader來讀取標籤,然後在每個頁面上進行一些分析。一旦對每個條目的分析完成後,我將生成的數據注入到數據庫中。這是一個非常簡單的Spring Batch的工作流程:使用多線程執行Spring批處理階段

read->process->write 

我想處理階段是多線程的,因爲它是自包含的,處理器密集型和寫階段不依賴的順序。

 /process\ 
read<-process->write 
    \process/ 

我已閱讀this問題,其中最多的回答說,級之間的數據存儲在JobRepository和說,這是不可取的,存儲大量數據的存在。

我已經看到了Spring Batch發行版中的'並行'示例,但是它並行處理整個第二個'加載'步驟(即讀取器,處理器和寫入器),而不是僅僅並行運行處理。

是否有可能說過程階段應該在特定大小的線程池中處理?我的工作流程是否適合Spring Batch,還是將它改寫爲正常的J2SE程序更好?

+0

我不知道春季批次,但你見過[5.3.5。 Split Flows](http://static.springsource.org/spring-batch/reference/html/configureStep.html#split-flows)章節中的文檔? – 2012-03-01 12:42:09

+0

我有,但我很難看到如何實現我想要的。 5.3.5和7.2並行步驟中的示例沒有顯示信息如何在它們之間傳遞,似乎也沒有顯示如何將讀取的數據分配到處理線程中。 – Rich 2012-03-01 12:49:01

+0

[7.1在文檔](http://static.springsource.org/spring-batch/reference/html/scalability.html)說,你可以簡單地配置一個'TaskExecutor'到步驟,這將自動導致每個塊到在單獨的線程中處理。 (我曾經這樣做過一次,它只是一個概念驗證,它的工作原理與前面描述的一樣。) 缺點是'StaxEventItemReader'不是線程安全的。此外,這並不真正回答如何在讀者之間傳遞數據的問題;即使你自己寫了,也沒有辦法分享真正有效的數據。 – Ickster 2012-03-05 13:37:46

回答

0

您的讀者必須是線程安全的。 如果這是不可能的,我建議你使用一個臨時區域:

  • 第一步:分析你的DATAS並將它們存儲在一個方便的格式某處。
  • 完成後,開始第二步:使用多線程,sql批處理和Java中的所有東西插入數據以提高性能。

也許NoSQL數據庫可能是存儲臨時數據的好候選者。