2013-11-25 21 views
0

我幾乎用Spring Batch完成了我的工作,它正在工作,但後來遇到了問題來處理錯誤。我將做一個簡單的例子:使用Spring批處理錯誤和控制中斷

我看了一個平面文件,我(後來)地圖3個變量:

ID CODE NAME 
AAA3333333Alex 
AAA3333333Mark 
BBB4444444Paul 

我希望讀者閱讀與控制斷裂平面文件(我不知道這是否是英文的正確名詞,意大利語中的「key break」就是這樣):我讀了具有相同ID和CODE的元素,並且只有當鍵更改纔將它們返回給讀者時:

while ((line = (Person) peek()) != null) { //while there are elements to read 
if (line.getId().equals(prevElement.getId()) && line.getCode().equals(prevElement.getCode()) 
    //do something 
} 

這工作正常:當ID或CODE更改時,我將元素返回給作者。 爲了完成這項工作,我必須將應用程序上下文中的commit-interval設置爲1。事情是,在最壞的情況下,如果每條線的元素不同,我承諾每一個元素,它變得非常慢。

所以我說:讓我們把外部控制。不是每次都返回元素作家關鍵的變化,我把它們放在一個列表,然後我返回列表中每200點主要變化(如...手工提交間隔):

while (controlBreakCount < 200 &&) { 
    while (!exit && (line = (Person) peek()) != null) { //while there are elements to read 
    if (line.getId().equals(prevElement.getId()) && line.getCode().equals(prevElement.getCode()) 
     //do something 
    else { //if the key changes 
     //there is a controlBreakCount++; to increase the count 
     //add the elements to a list 
    }  
    } 
} 
return the list 

並且這也起作用(真正的代碼有更多的控制,但這是以一種簡單的方式解釋)。 問題出現在這裏:在這種情況下如何處理監聽器的錯誤。在我放置外部(帶有controlBreakCount的那個)的情況下,如果200個元素中的一個出現錯誤,則列表中的所有元素都將轉到該偵聽器,因此很難識別出具有該錯誤的元素。

我想我的解決方案不是處理「控制中斷」的最佳方法,但我無法找到真正的太多(我不是很擅長Spring批處理)......可能我有一些幫幫我?

非常感謝你:)

回答

2

在你的代碼「有所作爲」的嫌疑...:/哪些操作做你該做的元素剛讀?在閱讀器中,您只應彙總項目並將其傳遞給處理器或作者。
恕我直言,你必須設置一個commit-interval大於1,使過程更快,並嘗試組相同的ID +密碼鑰匙你的數據在你自己定製的閱讀器,然後傳遞給作家這樣說:

class PersonList { 
    String id; 
    String code; 
    List<Person> persons = new ArrayList<Person>(); 
} 

時你發現一個keybreak(ID + CODE與前面的不同),你必須創建一個新的PersonList對象,並且直到ID + CODE與前一行相同才添加到當前的PersonList.person列表中。
如果您的問題是關於使用我的解決方案管理單行錯誤,您可以在閱讀器中進行管理,如果需要,也可以在閱讀器中跳過具有相同ID + CODE的項目。
您的閱讀器必須將其簽名更改爲MyPersonItemReader<PersonList>,並且您的作者將寫入PersonList對象,但是您已在您的控制之下控制該對象(使用ID + CODE)。

我希望我能正確理解你的問題。

+0

是的,你理解正確,問題是我傳給作者的結構(不正確)。現在按照你的建議,返回的對象更加「可以理解」,並且commit-interval以正確的方式工作:)非常感謝你的幫助!!!!!祝你今天愉快 :) – Pipkin