Spring Batch:持久保存每个项目的处理状态的正确方法

时间:2013-10-05 00:13:29

标签: spring-batch

场景:

  • 我正在使用Spring Batch 2.2.1.RELEASE
  • 我有一个Account存储库,其中包含用户及其电子邮件地址。
  • 每周,我想向所有用户发送电子邮件。这是定期的“批次”。
  • 我要求保留有关每个电子邮件当前处理状态的信息(... 电子邮件,... 帐户 ,......或等效的批次项
每个电子邮件的

处理状态包括

  • EMAIL_PROCESSING_FOR_THIS_ACCOUNT_HAS_STARTED
  • EMAIL_PROCESSING_FOR_THIS_ACCOUNT_HAS_ERROR
  • EMAIL_PROCESSING_FOR_THIS_ACCOUNT_SKIPPED_BECAUSE_OF_OPTOUT
  • EMAIL_PROCESSING_FOR_THIS_ACCOUNT_SUCCESSFUL

如果我已实施此要求,我可以查询相关存储库以获取以下信息:“对于2013-W40日历周,用户John Doe的电子邮件状态是成功的。

目前,我的Spring JavaConfig @Configuration看起来像这样:

@Bean
public Job emailSpringBatchJob() {
    return springBatchJobBuilderFactory.
            get("job").
            start( emailSpringBatchStep() ).
            build();
}

@Bean
public Step emailSpringBatchStep() {
    return springBatchStepBuilderFactory.
            get("step").
            <Account, MimeMessage> chunk(1).
            reader( accountReader() ).
            processor( accountToMimeMessageProcessor() ).
            writer( mimeMessageWriter() ).
            build();
}

@Bean
public ItemReader<Account> accountReader() {
    IteratorItemReader<Account> itemReader = new IteratorItemReader<>( accountRepository.getAllAccounts() );
    return itemReader;
}

@Bean
public ItemProcessor<Account, MimeMessage> accountToMimeMessageProcessor() {
    SomeMailProcessor itemProcessor = new SomeMailProcessor();
            // plus some configuration for itemProcessor
    return itemProcessor;
}

@Bean
public ItemWriter<MimeMessage> mimeMessageWriter() {
    MimeMessageItemWriter itemWriter = new MimeMessageItemWriter();
    //plus some configuration for itemWriter
    return itemWriter;
}

现在我找不到“正确的方法”来实现保持每个电子邮件当前处理状态的要求:

  • 我应该使用Spring Batch的ItemStream并修补其提供的ExecutionContext吗?
  • 我应该使用Spring Batch的ItemReadListenerItemProcessListenerItemWriteListener吗?
  • 我应该使用Spring Batch的ExceptionHandler吗?
  • 我应该扩展/编写自己的ItemReaderItemProcessorItemWriter类并放置任何类 有这个要求的业务逻辑吗?

我可以利用Spring Batch的哪些部分来优雅地满足我的要求?

1 个答案:

答案 0 :(得分:2)

处理这样的要求的典型方法是通过听众。这将处理本身的问题与国家管理分开。您可能希望查看各种基于项的侦听器之外的ChunkListener,因为一组项的状态应该一起移动。唯一不是这种情况的是EMAIL_PROCESSING_FOR_THIS_ACCOUNT_SKIPPED_BECAUSE_OF_OPTOUT状态,这需要一个ItemProcessListener。