De retour de plusieurs éléments de spring batch ItemProcessor

Je suis en train d'écrire un ressort lot et d'emploi dans l'une de mes pas, j'ai le code suivant pour le processeur:

@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");
    }
}

Le code ci-dessus fonctionne, mais j'ai trouvé qu'il ya des cas où le fait d'avoir plus d'un Account par NewsletterSubscriber est autorisé. J'ai donc besoin de supprimer le contrôle de l'état et de passer plus d'une Account à l'élément de l'écrivain.

Une solution que j'ai trouvé est de changer les deux ItemProcessor et ItemWriter de traiter avec List<Account> type, au lieu de Account mais présente deux inconvénients:

  • Code et des tests sont plus laide et la plus difficile à écrire et à maintenir en raison de listes imbriquées dans writer
  • Plus important à plus d'un Account objet peut être rédigée dans la même transaction car une liste donnée à l'écrivain peut contenir plusieurs comptes et je voudrais éviter cela.

Est-il de toute façon, peut-être l'aide d'un écouteur ou le remplacement de certains composants internes utilisés par spring batch pour éviter les listes de processeur?

Mise à jour

J'ai ouvert une question sur le printemps Jira pour ce problème.

Je suis à la recherche dans isComplete et getAdjustedOutputs méthodes de FaultTolerantChunkProcessor qui sont marqués comme des points d'extension dans SimpleChunkProcessor pour voir si je peux les utiliser d'une certaine façon à atteindre mon objectif.

Tout conseil est le bienvenu.

OriginalL'auteur Fabio | 2014-06-02