Я пишу пакетное задание spring, и на одном из моих шагов у меня есть следующий код для процессора:
@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, чтобы избежать списков в процессоре?
Update
Я открыл проблему на spring Jira для этой проблемы.
Я изучаю isComplete и getAdjustedOutputs методы в FaultTolerantChunkProcessor
, которые помечены как точки расширения в SimpleChunkProcessor
, чтобы увидеть, могу ли я каким-либо образом использовать их для достижения моей цели.
Любые подсказки приветствуются.