从弹簧批次项目处理器返回多个项目
我正在编写一个弹簧批处理作业,在我的一个步骤中,我有处理器的以下代码:
@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
NewsletterSubscriber
Account
我发现的一个解决方案是改变两者并处理类型而不是类型,但这有两个缺点:ItemProcessor
ItemWriter
List<Account>
Account
- 代码和测试更丑陋,更难编写和维护,因为编写器中有嵌套列表
- 最重要的是,在同一事务中可以写入多个对象,因为提供给编写器的列表可能包含多个帐户,我想避免这种情况。
Account
有没有办法,也许使用侦听器,或者替换spring批处理使用的一些内部组件,以避免处理器中的列表?
更新
我已经在春季Jira上为这个问题打开了一个问题。
我正在研究 isComplete 和 getAdjustedOutputs 方法,这些方法在 SimpleChunkProcessor
中被标记为扩展点,看看我是否能以某种方式使用它们来实现我的目标。FaultTolerantChunkProcessor
欢迎任何提示。