2015-12-04 103 views
0

我有兩個步驟春季批次+完成某個步驟

<batch:step id="parseXML" next="commitSQL"> 
     <batch:tasklet> 
      <batch:chunk reader="bookListReader" writer="xmlBookListWriter" commit-interval="1"/> 
     </batch:tasklet> 
    </batch:step> 
    <batch:step id="commitSQL"> 
     <batch:tasklet ref="databaseItemWriter"/> 
    </batch:step> 

我沒有與任何代碼的問題,但步驟commitSQL不執行可言,只有一步parseXML被無限運行。

我的讀者代碼

@Override 
public List<Book> read() throws Exception, UnexpectedInputException, ParseException, 
     NonTransientResourceException { 
    // TODO Auto-generated method stub 
    System.out.println("I am reading :) :)"); 
    List<Book> bookList = new ArrayList<>(); 
    bookList.add(new Book("Java","Cay","McGrall","1234")); 
    bookList.add(new Book("E Java","Cay","McGrall","1234")); 
    return bookList; 
} 

和作家代碼

private static void convertBookListToXML(List<? extends Book> books) throws IOException { 
List<Book> bookList = getBookList(books); 
try { 
    System.out.println("I am writer :) :)"); 
    JAXBContext jaxbContext = JAXBContext.newInstance(Books.class); 
    Marshaller xmlMarshaller = jaxbContext.createMarshaller(); 
    xmlMarshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE); 

    BufferedWriter writer = new BufferedWriter(new FileWriter(BOOK_FILE)); 
    xmlMarshaller.marshal(new Books(bookList), writer); 
    writer.close(); 
} catch (JAXBException e) { 
    e.printStackTrace(); 
} 
} 

parseXML,但我對commitSQL代碼是不執行的。任何建議我怎麼會出來parseXML並繼續commitSQL

+1

請使用正確的標籤;這個問題與批處理文件的Windows.BAT批處理文件沒有任何關係! – Aacini

+1

您必須從ItemReader.read()返回null來停止讀取過程 –

+0

@LucaBassoRicci,您的選擇爲我工作 –

回答

1

在基於塊的步驟中,一旦所有輸入耗盡,就認爲一個步驟完成。這由ItemReader返回null表示。在你的讀者的情況下,你永遠不會返回null,所以它會永遠運行。

0

我認爲讀者返回列表,這是正確的。 Spring-Batch編寫器應該包含一個寫入方法,並且位於ItemWriter接口層次結構中的某處。這是從問題中給出的代碼示例中不可見的。

也許最簡單的方法是檢查Spring-Batch手冊章節。 6.7.2對於StaxEventItemWriter的例子,這個作者也有很多例子可以通過Google找到。