2015-08-16 80 views
2

所以就像標題所說的那樣,整個批處理作業到底如何與Spring Batch一起使用?我明白(當然,如果我錯了,請糾正我)有一個存儲作業的存儲庫,然後每個作業都有步驟,每個步驟都是一個tasklet或ItemReaders和ItemProcessors的組合,隨後是ItemWriter一塊已經填滿了。春季批次:執行一項工作究竟如何到齊?

我不明白究竟怎麼這一切看起來,在實際的代碼;我一直在閱讀文檔並查看示例,但我已經無法彌補。我甚至可以告訴工作在何時/何地運行?有幾百萬個以「Job」開頭的類,我怎麼最少使用它們來存儲我定義的作業,然後在何時何地運行它們?另外,我看到的所有示例都是完全/基於XML的,但我想盡可能使用盡可能少的XML。

我困惑的另一大問題,就是究竟是ItemReader /處理器/作家知道他們正在使用的物品是什麼項目/塊的?不要太想象我自己實現了一個ItemProcessor,爲此,我顯然需要訪問它正在處理的項目,或者爲ItemWriter,我想訪問該塊它想寫的項目。

+0

*何時執行*不是Spring Batch的一部分,因爲它使用定時器或石英庫。我也想知道你是否真的看了一下'ItemReader','ItemWriter'和'ItemProcessor'的javadoc,它向你展示了API並解答了你的問題。 –

+0

是的我從實際的答案中知道這些類的文檔回答了我的問題的一部分。這些文檔似乎還不能說明我如何通過使用tasklets作爲步驟來傳遞和訪問具有作業的對象。 – rawa

回答

1

回答你的問題的基礎 -

1)每個職業都有一個id,你將確定使用這個ID來執行該任務。
2)作業一般由多個步驟組成,每一步都有一個名爲next的屬性。在下一個屬性中,您將定義下一步要執行的步驟的標識。
3)每個步驟都有一個閱讀器,處理器和編寫器,以防萬一您的步驟做的不是這些,您可以在一個tasklet中定義它。
4)定義Reader和Writer時,你必須定義它將獲取或寫入的數據類型。例如,在BatchItemReader中定義一個RowMapper。
5)您可以使用JobExecutionDecider在加載作業定義後決定哪一步需要執行。對於其餘步驟,它可以使用下一個屬性。

像春天你的應用環境只需要知道你的工作的定義,因爲它需要了解bean定義的加載。

Which job to execute:作業定義的標識被使用。要執行對於第一步驟,JobExecutionDecider可以使用其他使用的下一個屬性將與下一工序的ID被用於:
Which step to execute in Job
What is there in a step:讀取器讀取數據,處理器對獲取的數據進行處理,最後寫入器寫入數據。如果step執行的操作不是在tasklet中定義的。

+0

那麼,tasklet如何跟蹤它正在處理的內容呢?假設我想給工作提供多個對象的輸入(通過列表),我甚至可以首先傳遞對象,然後我將如何訪問它們以便我可以對它們做什麼? – rawa

+0

您可以將列表或任何其他對象存儲在作業執行上下文中,並將tasklet的作用域定義爲步驟,這些存儲的數據可以在任何其他tasklet中檢索。有關如何在小工具之間傳遞參數的問題,請參閱我的回答。 –

+0

如果作業執行不存在,直到我調用作業才能運行,那麼在作業運行之前我該如何存儲在執行上下文中?我不明白你定義tasklet的範圍是什麼意思,你能澄清一下嗎?當你說「在tasklets之間傳遞參數」時,你的意思是特定工作中的tasklets嗎? (像「step1tasklet」,「step2tasklet」等?) – rawa

2

Mkyong.com有一些不錯的春天batch tutorials這給的什麼工作實際配置看起來像一些比較明顯的例子。請參閱基本示例here。不幸的是,這些例子大部分都是XML。下面是一個blog post的例子,使用java配置。

根據物品讀取器/處理器/寫入器類型的步驟。你通常會有一個閱讀器和至少一個處理器/寫入器組合。兩者都不是必需的。

就理解每一個而言,檢查接口 - 它們可能有助於爲您清理它。例如,這裏有一個ItemWriter接口:

void write(java.util.List<? extends T> items) 

http://docs.spring.io/spring-batch/trunk/apidocs/org/springframework/batch/item/ItemWriter.html

注意它需要一批項目來寫的。處理器通常逐項工作。讀者可以分頁(通過實現AbstractPagingItemReader),並在實際執行提取(例如對數據庫的分頁查詢)之前收集迭代中的項目。

+0

好吧,現在如果我爲我的步驟使用一個tasklet,那麼tasklet如何訪問作業要處理的項目呢? – rawa