我正在使用FlatFileItemReader讀取文件。我插入DefaultLineMapper和我自己的自定義FieldSetMapper(myMapper)。Spring批處理:如何獲取所有行讀取的錯誤?
目前在myMapper中,當發生錯誤時,我只需記錄它。我想積累全部錯誤,對於文件中的所有行,然後將它們保存到文件中。
我正在考慮實施我自己的Tasklet。但是從我讀過的內容來看,建議只在你的步驟是而不是進行面向塊的處理時才這樣做。
另一種選擇是使用ItemListenerSupport或ItemReadListener並實現onReadError()方法。但如果我這樣做,我不知道我如何能夠訪問全局/共享對象,其中包含所有錯誤的列表,對於全部爲行。
我一直在這兩個選項之間來回試圖讓他們工作,沒有太大的成功。任何建議非常感謝。
*****編輯*****
我的代碼不是什麼非標準的我不認爲。我定義的錯誤日誌工作帕拉姆:
Map<String, JobParameter> jobParametersMap ...
jobParametersMap.put("errorsFile", new JobParameter(errorsFileURI));
我的XML配置是這樣的:
<job ...>
<step ...>
<step id="import">
<tasklet>
<chunk reader="importReader" writer="importWriter" .../>
</tasklet>
</step>
</job>
<bean id="importReader" class="MyImportReader" scope="step">
<property name="resource" .../>
<property name="lineMapper">
<bean class = "...DefaultLineMapper">
...
<property name="fieldSetMapper" ref="importMapper"/>
</bean>
</property>
<property name="errorsFile" value="#jobParameters['errorsFile']}"/>
</bean>
<bean id="importWriter" ...scope="step">
...
<property name="errorsFile" value="#jobParameters['errorsFile']}"/>
</bean>
Reader類擴展FlatFileItemReader並實現ItemReadListener。作者實現了BatchLoadableWriter和StepExecutionListener。
正如你所看到的,我將errorsFile傳遞給Reader和Writer。 Writer使用了錯誤文件一段時間,而我只是將它添加到Reader中。這兩個類都有一個getFile/setter用於errorsFile。
它們之間的區別是在Writer中,@Overridden write()方法進行驗證,然後將全部項寫入文件中。所以所有錯誤一次寫入errorsFile。另外,如果有錯誤,則設置一個標誌(hasErrors),並在@Overridden afterStep()方法中檢查該標誌的值。如果是,則返回ExitStatus.FAILED。
鑑於讀者,每個Item調用一次doRead()方法。如果出現錯誤,我可以將它寫入errorsFile,並且我可以設置一個像Writer那樣的標誌。但該標誌將設置爲,該行/ Item僅爲。
讓我們說我輸入10行。前5個錯誤,最後5個錯誤。當調用afterRead()時,它將檢查最後處理的Item的標誌值,該標誌沒有錯誤,因此hasErrors將爲false。不好。或者重寫onReadError()會更好。但是什麼會導致該方法被調用,這是Mapper中的一個錯誤?
東西告訴我實現我自己的Reader,和/或讓它實現ItemReadListener可能不是這樣的方式。對我來說,我似乎需要將這些邏輯中的一部分或全部放在讀者的「父母」中......這將是...一個Tasklet?但是我已經閱讀過SO和其他網絡上的其他地方,不推薦使用自己的Tasklet來執行塊處理。它應該只適用於簡單的任務。
我不知所措...
你可以發佈一些代碼,你正在配置你的彈簧批處理作業。它使答案更容易。 – emeraldjava