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
此账户的电子邮件处理成功
@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并以某种方式进行映射,但目标是使每个阶段尽可能地解耦。