感謝您的澄清。如果我理解正確,則表示文件中的每行包含ClassA
,ClassB
和ClassC
的一個實例。我假設對於這個例子,但即使有不同的關係,解決方案也是相似的。
設置Spring Batch作業的關鍵是要考慮什麼構成「項目」以及你想要發生什麼。您還需要了解框架如何將每個接口的輸出作爲下一個輸入的輸入。 (春天有好的documentation)。 ItemReader
的退貨類型爲單身人士至ItemProcessor
。所以在你的情況下,ItemProcessor
實際上應該是ItemProcessor<CsvFileLine, ProcessorResult>
而不是你所擁有的ItemProcessor<List<CsvFileLine>, ProcessorResult>
。從ItemProcessor
到ItemWriter
的切換有點棘手。 ItemWriter
實現應採用ItemProcessor
返回類型的List
。 ItemWriter
需要List
,因爲Spring批次組ItemProcessor
一起輸出到事務中。在你的情況下,你可以有ItemWriter<List<ProcessorResult>>
。
有了這個基礎,我們可以改變ProcessorResult
的結構,然後作者很容易實現。相反包含數據的所有文件中的ProcessorResult
的,它將從只有一行包含的數據:
public class ProcessorResult {
private ClassA classA;
private ClassB classB;
private ClassC classC;
// Constructor and getters omitted for brevity
}
的ItemProcessor
需要一個CsvFileLine
並將其轉換成一個ProcessorResult
:
public class ExampleProcessor implements ItemProcessor<CsvFileLine, ProcessorResult> {
public ProcessorResult process(CsvFileLine line){
// mapping into ProcessorResult goes here
}
ItemWriter
需要List
這些,並需要將它們保存到數據庫。它可能是這個樣子:
public class ExampleItemWriter implements ItemWriter<List<ProcessorResult>{
private ClassADao classADao;
private ClassBDao classBDao;
private ClassCDao classCDao;
public void write(List<? extends ProcessorResult> items){
for(ProcessorResult result : items){
classADao.save(result.getClassA());
classBDao.save(result.getClassB());
classCDao.save(result.getClassC());
}
}
}
記住,在List
每個元素傳遞給ItemWriter
映射回在ItemReader
的單個項目。通常,這也是文件中的一行。要使用Spring Batch,您必須確保ItemReader
的返回類型是ItemProcessor
的輸入類型。同時,ItemWriter
的輸入是由ItemProcessor
返回的類型的List
。您在這裏的讀者,處理器和作者不遵循這種模式,並且框架將無法使用它們。一些小的改變應該允許你使用你在框架內編寫的代碼。
最後,我會注意到你可能完全沒有ItemProcessor
。您可以只有ItemReader<ProcessorResult>
和ItemWriter<ProcessorResult>
並在ItemReader
中執行映射。因此,您將邏輯從當前的ItemProcessor
改爲LineMapper<ProcessorResult>
。然後在FlatFileItemReader
中使用它,然後將所有內容直接從讀寫器傳遞給寫入器。這超出了你的問題的範圍,我更喜歡XML配置,所以我將放棄它。
1.爲什麼不使用標準的Spring Batch組件讀取CSV('FlatFileItemReader'等)? 2.處理多個項目類型和'ItemWriter'抽象有幾個不同的選項。像'ClassifierCompositeItemWriter'中的構成是最常見的方法。 –
CSV文件中的行如何與最終要寫入數據庫的內容相關聯?文件中的一行是否恰好對應於數據庫中的一個插入/更新,即「ClassA」,「ClassB」或「ClassC」中的某一行?一個文件行可以表示這些類之一的多個實例嗎?我認爲你在這裏反對Spring Batch框架,但是如果不知道實際的最終目標,我不能提供很多有用的建議。 – mymarkers
@MichaelMinella我是Spring Batch的新手,我遵循一個常見的例子,我認爲這是房子的一個標準。你有沒有很好的例子說明如何在不使用XML註釋的情況下使用'FlatFileItemReader'? –