2016-12-03 309 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中的条目。

这样,所有内容都运行在同一个事务中;因此,不存在数据不一致的风险。