0

设想:

  • 我正在使用 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 的电子邮件状态为 SUCCESSFUL。

目前,我的 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 BatchItemStream并对其提供的修补程序ExecutionContext吗?
  • 我应该使用 Spring Batch 的ItemReadListener,ItemProcessListenerItemWriteListener吗?
  • 我应该使用 Spring Batch 的ExceptionHandler吗?
  • 我是否应该扩展/编写自己的ItemReaderItemProcessorItemWriter类并将与此要求相关的任何业务逻辑放在那里?
  • ?

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

4

1 回答 1

2

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

于 2013-10-06T16:17:26.970 回答