Spring batch springbatch:保存每个单独项目的处理状态的正确方法

Spring batch springbatch:保存每个单独项目的处理状态的正确方法,spring-batch,Spring Batch,情景: 我使用的是SpringBatch2.2.1.RELEASE 我有一个帐户存储库,包含用户及其电子邮件地址 每周,我想向所有用户发送电子邮件。这是周期性的“批次” 我需要保存有关每个电子邮件(…电子邮件,…帐户,…或等效的批处理项目)当前处理状态的信息。 每个电子邮件的处理状态包括 此帐户的电子邮件\u处理\u已启动 此账户的电子邮件处理有错误 电子邮件\u处理\u此\u帐户\u跳过\u,因为\u OPTOUT的\u 此账户的电子邮件处理成功 如果我实现了这个要求,我可以查询相关的

情景:

  • 我使用的是SpringBatch
    2.2.1.RELEASE
  • 我有一个
    帐户
    存储库,包含用户及其电子邮件地址
  • 每周,我想向所有用户发送电子邮件。这是周期性的“批次”
  • 我需要保存有关每个电子邮件(…电子邮件,…帐户,…或等效的批处理项目)当前处理状态的信息。
每个电子邮件的处理状态包括

  • 此帐户的电子邮件\u处理\u已启动
  • 此账户的电子邮件处理有错误
  • 电子邮件\u处理\u此\u帐户\u跳过\u,因为\u OPTOUT的\u
  • 此账户的电子邮件处理成功
如果我实现了这个要求,我可以查询相关的存储库以获取信息,例如:“对于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;
}
@Bean
公共作业emailSpringBatchJob(){
返回springBatchJobBuilderFactory。
得到(“工作”)。
开始(emailSpringBatchStep())。
build();
}
@豆子
公共步骤emailSpringBatchStep(){
返回springBatchStepBuilderFactory。
获取(“步骤”)。
块(1)。
读卡器(accountReader())。
处理器(accountToMimeMessageProcessor())。
编写器(mimessagewriter())。
build();
}
@豆子
public ItemReader accountReader(){
IteratorItemReader itemReader=新的IteratorItemReader(accountRepository.getAllAccounts());
返回项目阅读器;
}
@豆子
public ItemProcessor accountToMimeMessageProcessor(){
SomeMailProcessor itemProcessor=新的SomeMailProcessor();
//加上itemProcessor的一些配置
返回项处理器;
}
@豆子
公共项目编写器mimessagewriter(){
MimeMessageItemWriter itemWriter=新的MimeMessageItemWriter();
//加上itemWriter的一些配置
返回项目编写器;
}
现在,我一直在寻找“正确的方法”来实现保留每个电子邮件当前处理状态的要求:

  • 我应该使用SpringBatch的
    ItemStream
    并修补它提供的
    ExecutionContext
  • 我应该使用Spring批处理的
    ItemReadListener
    ItemProcessListener
    ItemWriteListener
  • 我应该使用SpringBatch的
    异常处理程序吗
  • 我是否应该扩展/编写自己的
    ItemReader
    ItemProcessor
    itemrater
    类,并放置任何 是否存在与此需求相关的业务逻辑
  • ?

我可以利用SpringBatch的哪些部分优雅地满足我的需求?

处理此类需求的典型方法是通过侦听器。这将处理本身的关注点与状态管理分离。您可能希望将ChunkListener置于各种基于项的侦听器之外,因为一组项的状态应该一起移动。唯一不属于这种情况的时间是该帐户跳过的电子邮件处理,因为该帐户处于OPTOUT状态,需要一个ItemProcessListener。

ItemWriter
“阶段”,Spring Batch是否提供了从每个输出项返回到每个相关输入项的引用的方法。。。例如,在
ItemWriter.write(List items)
中,对于每个
MimeMessage
项目,根据该邮件项目的传递成功或失败,我需要返回对
帐户的引用,以更新处理状态。我目前的工作是将
MimeMessage
的电子邮件地址映射回
帐户
,但这似乎不必要地复杂,事实并非如此。这是故意的。虽然电子邮件的编写可能比大多数其他编写器更具专业性,因为编写器获取构建的输出并将其持久化,而不是获取POJO并以某种方式进行映射,但目标是使每个阶段尽可能地解耦。