Spring batch jpaPagingItemReader pourquoi certaines lignes ne sont pas lus?

Je 'm à l'aide de Spring Batch(3.0.1.De presse) /JPA et un HSQLBD serveur de base de données.
J'ai besoin de parcourir l'ensemble d'un tableau (à l'aide de la pagination) et les éléments de mise à jour (un par un). J'ai donc utilisé une jpaPagingItemReader. Mais quand je lance l'emploi, je peux voir que certaines lignes sont ignorés, et le nombre de sauté de lignes est égal à la taille de la page. Pour savoir si mon tableau comporte des lignes 12 et le jpaPagingItemReader.pagesize = 3 le travail de lecture : les lignes 1,2,3 puis lignes 7,8,9 (donc sauter les lignes 4,5,6)...
Pourriez-vous me dire quel est le problème dans mon code de configuration/ou peut-être un problème avec HSQLDB de pagination?
Ci-dessous mon code:

[MODIFIER] : Le problème est avec mon ItemProcessor qui effectue la modification de la Pojo Entités. Depuis JPAPagingItemReader fait une chasse d'eau entre chaque lecture, les Entités sont mises à jour ((c'est ce que je veux) . Mais il semble que le curseur de la pagination est également incrémenté (comme on peut le voir dans le journal: l'ID de ligne 4, 5 et 6 ont été ignorés). Comment puis-je gérer ce problème ?

@Configuration
@EnableBatchProcessing(modular=true)
public class AppBatchConfig {
  @Inject
  private InfrastructureConfiguration infrastructureConfiguration;  
  @Inject private JobBuilderFactory jobs;
  @Inject private StepBuilderFactory steps;

  @Bean  public Job job() {
     return jobs.get("Myjob1").start(step1()).build();
  }
  @Bean  public Step step1() {  
      return steps.get("step1")
                .<SNUserPerCampaign, SNUserPerCampaign> chunk(0)
                .reader(reader()).processor(processor()).build();   
  }
  @Bean(destroyMethod = "")
@JobScope 
public ItemStreamReader<SNUserPerCampaign> reader() String trigramme) {
    JpaPagingItemReader reader = new JpaPagingItemReader();
    reader.setEntityManagerFactory(infrastructureConfiguration.getEntityManagerFactory());
    reader.setQueryString("select t from SNUserPerCampaign t where t.isactive=true");
    reader.setPageSize(3));
    return reader;
}
 @Bean @JobScope
 public ItemProcessor<SNUserPerCampaign, SNUserPerCampaign> processor() {   
     return new MyItemProcessor();
 }
}

@Configuration
@EnableBatchProcessing
public class StandaloneInfrastructureConfiguration implements InfrastructureConfiguration {
 @Inject private EntityManagerFactory emf;  
 @Override
public EntityManagerFactory getEntityManagerFactory() {
    return emf;
}
}  

de mon ItemProcessor:

@Override
public SNUserPerCampaign process(SNUserPerCampaign item) throws Exception {
    //do some stuff …
   //then if (condition) update the Entity pojo :   
   item.setModificationDate(new Timestamp(System.currentTimeMillis());
   item.setIsactive = false;

}

de Printemps fichier de configuration xml:

<tx:annotation-driven transaction-manager="transactionManager" />     
<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
    <property name="entityManagerFactory" ref="entityManagerFactory" />
</bean>

<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
    <property name="dataSource" ref="dataSource" />
</bean>

<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    <property name="driverClassName" value="org.hsqldb.jdbcDriver" />
    <property name="url" value="jdbc:hsqldb:hsql://localhost:9001/MYAppDB" />
    <property name="username" value="sa" />
    <property name="password" value="" />
</bean>

trace/log résumé :

11:16:05.728 TRACE MyItemProcessor - item processed: snUserInternalId=1]
11:16:06.038 TRACE MyItemProcessor - item processed: snUserInternalId=2]
11:16:06.350 TRACE MyItemProcessor - item processed: snUserInternalId=3]

11:16:06.674 DEBUG SQL- update SNUSER_CAMPAIGN  set ...etc...
11:16:06.677 DEBUG SQL- update SNUSER_CAMPAIGN  set ...etc...
11:16:06.679 DEBUG SQL- update SNUSER_CAMPAIGN  set ...etc...

11:16:06.681 DEBUG SQL- select ...etc... from  SNUSER_CAMPAIGN snuserperc0_ 

11:16:06.687 TRACE MyItemProcessor - item processed: snUserInternalId=7]
11:16:06.998 TRACE MyItemProcessor - item processed: snUserInternalId=8]
11:16:07.314 TRACE MyItemProcessor - item processed: snUserInternalId=9]
Comment avez-vous confirmé ce que les lignes sont en train de lire? Est-il une trace de la pile/journal d'informations, vous pouvez fournir?
J'ai réalisé que le problème était mon ItemProcessor que les changements de l'entité pojo, j'ai édité ma question par l'ajout de traces
Je suis un peu confus. Les articles retournés de la JpaPagingItemReader sont détachés de sorte qu'ils ne devraient pas être mis à jour sans explicite de l'écriture. Pouvez-vous fournir tout le travail de configuration?
Je vais essayer d'ajouter plus de détails demain. De toute façon, ce que je peux voir au Printemps JPAPagingItemreader du code source, c'est que les éléments semble être détaché lors de la lecture de la page suivante (en faisant une couleur claire pour le contexte). C'est pourquoi je n'ai pas besoin d'un ItemWritter persister ma mise à jour. Un détail important peut-être que dans mon Élément de Processeur-je mettre à jour une valeur de type boolean qui est dans mon SÉLECTIONNEZ clause where; je ne sais pas si cela peut modifier la pagination du curseur.
La chasse d'eau et clair, c'est juste un nettoyage au début. À la fin de JpaPagingItemReader nous boucle à travers les éléments et explicitement les détacher, ou de valider la transaction, de sorte qu'ils sont détachés. Dans les deux cas, les entités retournées à partir de la JpaPagingItemReader doit être dans l'état détaché. Vous pouvez poster la configuration de votre travail?

OriginalL'auteur ThierryC | 2014-10-22