1


0

Comportement étrange de l’écouteur à sauter dans les opérations de lecture et d’écriture

J’ai un travail qui lit un fichier plat de 11 enregistrements. Je saute 1 élément dans le lecteur et 4 dans les écrivains. J’ai un Skiplistener avec la méthode` SkipInRead () et SkipInWrite () qui enregistre simplement le message de saut dans la base de données. Pourquoi mon `onSkipInRead est appelé plusieurs fois, c’est-à-dire 3 fois dans ce cas qui en résultat enregistre le même message dans DB 3 fois. OnSkipinWrite fonctionne très bien


'' '' '

public class GenericSkipListener extends AbstractBaseSkipListener implements
    SkipListener {

private static final Log LOGGER = LogFactory.getLog(GenericSkipListener.class);

@Autowired
private SkipedItemsDao skipedItemsDao;


@Override
public void onSkipInRead(final Throwable t) {
    LOGGER.warn("[" + getJobName() + "] onSkipInRead:" + t);
    skipedItemsDao.saveReadSkippedItem(createReadSkipedItem("READ", "", t));
}

@Override
public void onSkipInWrite(final FieldSet item, final Throwable t) {
    LOGGER.warn("[" + getJobName() + "] onSkipWrite:" + t);
    skipedItemsDao.save(createSkipedItem("WRITE", item.toString(), t));
}

@Override
public void onSkipInProcess(final FieldSet item, final Throwable t) {
    LOGGER.warn("[" + getJobName() + "] onSkipInProcess:" + t);
    skipedItemsDao.save(createSkipedItem("PROCESS", item.toString(), t));
}
}

Ma méthode onSkipInRead () est appelée plusieurs fois pour le même élément. Des gars d’idée?

1 Answer


0


  • Je saute 1 élément dans le lecteur

En faisant quoi?

  • _ plusieurs fois pour le même article_

Cela ne serait possible que si vous relisez le même élément vous-même, ou si vous avez un seul mauvais élément répété 3 fois dans votre fichier.

  • 3 fois dans ce cas

onSkipInRead est appelé après la lecture de l’intervalle de validation (il respecte les limites des transactions), vous pouvez donc avoir un seul élément que vous" sautez "per intervalle de validation. Et si c’est par exemple tous les 3 articles:

11 % 3 = 3 bad items skipped

MODIFIER après clarification du problème (dans les commentaires)

Afin d’ignorer les premières lignes X du fichier, définissez linesToSkip sur un` FlatFileItemReader`:

/**
 *  Public setter for the number of lines to skip at the start of a file.
 *  Can be used if the file contains a header without useful (column name) information,
 *  and without a comment delimiter at the beginning of the lines.
 *
 *  linesToSkip - the number of lines to skip
 **/
public void setLinesToSkip( int linesToSkip ) { // ... }

Ou / Et, s’il y a quelque chose de spécial à faire pour les premières lignes sautées:

/**
 * skippedLinesCallback - will be called for each one of the initial skipped lines
 * before any items are read.
 **/
public void setSkippedLinesCallback( LineCallbackHandler skippedLinesCallback ) { // ... }