Spring批-删除

tcbh2hod  于 2022-11-23  发布在  Spring
关注(0)|答案(2)|浏览(160)

如何删除刚才保留的实体?

@Bean
  public Job job() {
    return this.jobBuilderFactory.get("job")
        .start(this.syncStep())
        .build();
  }

  @Bean
  public Step syncStep() {
    // read
    RepositoryItemReader<Element1> reader = new RepositoryItemReader<>();
    reader.setRepository(repository);
    reader.setMethodName("findElements");
    reader.setArguments(new ArrayList<>(Arrays.asList(ZonedDateTime.now())));
    final HashMap<String, Sort.Direction> sorts = new HashMap<>();
    sorts.put("uid", Sort.Direction.ASC);
    reader.setSort(sorts);
    // write
    RepositoryItemWriter<Element1> writer = new RepositoryItemWriter<>();
    writer.setRepository(otherrepository);
    writer.setMethodName("save");
    return stepBuilderFactory.get("syncStep")
            .<Element1, Element2> chunk(10)
            .reader(reader)
            .processor(processor)
            .writer(writer)
            .build();
  }

这是一个转储元素的过程。我们将元素从一个表传递到另一个表。

n3ipq98p

n3ipq98p1#

这是一个转储元素的过程。我们将元素从一个表传递到另一个表。
您可以分两个步骤来完成。第一个步骤是将项目从一个数据表复制到另一个数据表。第二个步骤是从来源数据表删除项目。只有在第一个步骤成功时,才应该执行第二个步骤。

afdcj2ne

afdcj2ne2#

有几个选项:
使用CompositeItemWriter
您可以创建另一个执行删除逻辑的ItemWriter,例如:

RepositoryItemWriter<Element1> deleteWriter = new RepositoryItemWriter<>();
deleteWriter.setRepository(repository);
deleteWriter.setMethodName("delete");

要执行这两个写入器,可以使用CompositeItemWriter

CompositeItemWriter<User> writer = new CompositeItemWriter<>();
// 'saveWriter' would be the writer you currently have
writer.setDelegates(List.of(saveWriter, deleteWriter));

然而,如果你的ItemProcessor将原始实体转换成全新的实体,这就不起作用了。

  • (请注意,根据this question,写入器按顺序运行,如果第一个写入器失败,则不应执行第二个写入器,但我对此不是100%肯定。)*

使用单独的Step

或者,您可以将新编写器放在完全独立的Step中:

@Bean
  public Step cleanupStep() {
    // Same reader as before (might want to put this in a separate @Bean)
    RepositoryItemReader<Element1> reader = new RepositoryItemReader<>();
    // ...
    // The 'deleteWriter' from before
    RepositoryItemWriter<Element1> deleteWriter = new RepositoryItemWriter<>();
    // ...
    return stepBuilderFactory.get("cleanupStep")
        .<Element1, Element2> chunk(10)
        .reader(reader)
        .writer(writer)
        .build();
  }

现在,您可以分别计划这两个步骤:

@Bean
public Job job() {
    return this.jobBuilderFactory.get("job")
        .start(this.syncStep())
        .next(this.cleanupStep())
        .build();
}

使用Tasklet
如果使用单独的步骤,并且根据数据量的不同,将数据完全卸载到数据库并执行单个delete ... where ...查询可能会更有趣。

public class CleanupRepositoryTasklet implements Tasklet {
    private final Repository repository;

    @Override
    public RepeatStatus execute(StepContribution contribution, ChunkContext chunkContext) throws Exception {
        repository.customDeleteMethod();
        return RepeatStatus.FINISHED;
    }
}

然后,可以通过在配置中声明一个新的Step,以与前面相同的方式注册此Tasklet

return this.stepBuilderFactory.get("cleanupStep")
    .tasklet(myTasklet())
    .build();

相关问题