我正在编写一个春季批处理作业,在我的一个步骤中,我有以下处理器代码:
@Component
public class SubscriberProcessor implements ItemProcessor<NewsletterSubscriber, Account>, InitializingBean {
@Autowired
private AccountService service;
@Override public Account process(NewsletterSubscriber item) throws Exception {
if (!Strings.isNullOrEmpty(item.getId())) {
return service.getAccount(item.getId());
}
// search with email address
List<Account> accounts = service.findByEmail(item.getEmail());
checkState(accounts.size() <= 1, "Found more than one account with email %s", item.getEmail());
return accounts.isEmpty() ? null : accounts.get(0);
}
@Override public void afterPropertiesSet() throws Exception {
Assert.notNull(service, "account service must be set");
}
}
上面的代码有效,但我发现在某些极端情况下允许有多个Account
per 。NewsletterSubscriber
所以我需要删除状态检查并将多个传递Account
给项目编写者。
我发现的一种解决方案是同时更改ItemProcessor
并ItemWriter
处理List<Account>
类型而不是,Account
但这有两个缺点:
- 由于编写器中的嵌套列表,代码和测试更难编写和维护
- 最重要的是,同一事务中可能会写入多个
Account
对象,因为给 writer 的列表可能包含多个帐户,我想避免这种情况。
有什么办法,可能使用监听器,或者替换弹簧批处理使用的一些内部组件以避免处理器中的列表?
更新
我已经为这个问题在 spring Jira 上打开了一个问题。
我正在研究isComplete和getAdjustedOutputs方法,FaultTolerantChunkProcessor
其中标记为扩展点,SimpleChunkProcessor
看看我是否可以以某种方式使用它们来实现我的目标。
欢迎任何提示。