2016-12-03 310 views

回答

0

我想這個自定義動作的最佳方式是添加StepListener。 像這樣

@Bean 
    public Step stepA(ItemReader<String> readerA, ItemWriter<String> writerA) { 
      return stepBuilderFactory.get("stepA").<String, String> chunk(1) 
         .reader(readerA).writer(writerA).listener(stepListener()).build(); 
    } 

你必須實現StepExecutionListener。

public class CustomStepListener implements StepExecutionListener { 

@Override 
public void beforeStep(StepExecution stepExecution) { 
    System.out.println("StepExecutionListener - beforeStep"); 
} 

@Override 
public ExitStatus afterStep(StepExecution stepExecution) { 
    System.out.println("StepExecutionListener - afterStep. Here we will delete all records"); 
    return null; 
} 

}

在這一步,你願意,你可以刪除記錄的範圍。 SqlQuery,Repository等

+0

我會推薦這種方法,因爲偵聽器在單獨的事務中運行。 (看看這篇文章:https://blog.codecentric.de/en/2012/03/transactions-in-spring-batch-part-2-restart-cursor-based-reading-and-listeners/)。 –

0

我會建議使用CompositeItemWriter。添加MyBatisBatchItemWriter作爲第一個寫入器並添加第二個寫入器,刪除表A中的條目。

這樣,所有內容都運行在同一個事務中;因此,不存在數據不一致的風險。