有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java回滚Spring批处理作业

实际上,我的工作包括以下几个步骤和两个小任务:

@Bean
public Step stepItem() {
    return stepBuilderFactory.get("stepItem")
            .<Item, Item> chunk(10)
            .reader(itemReader())
            .processor(itemProcessor())
            .faultTolerant()
            .writer(itemWriter())
            .build();
}

@Bean
public Step deleteAllItemStep() {
    return stepBuilderFactory.get("deleteAllItemStep")
            .tasklet(itemStepDeleteAllTasklet())
            .build();
}

这是我的定制小任务

public class ItemStepDeleteAllTasklet implements Tasklet{

private ItemRepository itemRepository;

public ItemStepDeleteAllTasklet(ItemRepository itemRepository) {
    this.itemRepository = itemRepository;
}

@Override
public RepeatStatus execute(StepContribution stepContribution, ChunkContext chunkContext) throws Exception {
    itemRepository.deleteAllInBatch();
    return null;
}
}

这是我对主要工作的配置

@Configuration
@Import({BatchItemConfiguration.class, BatchCriticalComponentConfiguration.class})
public class BatchConfiguration {

@Autowired
private JobBuilderFactory jobBuilderFactory;

@Autowired
private Step stepCriticalComponent;

@Autowired
private Step stepItem;

@Autowired
private Step deleteAllItemStep;

@Autowired
private Step deleteAllCriticalComponentStep;

@Bean
public Job importJob(JobCompletionNotificationListener listener) {
    return jobBuilderFactory.get("importJob")
            .incrementer(new RunIdIncrementer())
            .listener(listener)
            .start(deleteAllCriticalComponentStep)
            .next(deleteAllItemStep)
            .next(stepItem).next(stepCriticalComponent)
            .build();
}

}

事实上,如果一个步骤(stepItem或stepCriticalComponent)失败,tasklet删除的数据就会消失,我无法恢复它。 有没有办法对整个作业进行回滚,或者在特定步骤/小任务之前进行回滚


共 (1) 个答案

  1. # 1 楼答案

    Spring批处理中没有回滚整个作业或步骤的概念。但是,您可以使用侦听器(JobExecutionListenerStepExecutionListener)执行补偿逻辑,手动执行回滚