2017-04-13 1 views
0

J'ai ce travail mais lors de son exécution la méthode beforeStep dans le partitionneur n'est jamais appelée. Qu'est-ce que je fais mal?Partitioner implémente StepExecutionListener mais beforeStep n'est pas appelé

@Configuration 
public class SomeJob { 

@Bean(name = "some-job") 
public Job job() { 
    return jobBuilderFactory.get(getName()) 
      .incrementer(new RunIdIncrementer()) 
      .start(stepOne()) 
      .next(stepTwo()) 
      .build(); 
} 

private Step stepOne() { 
    TaskletStep stepOne = stepBuilderFactory 
      .get("step-one") 
      .<...>chunk(CHUNK_SIZE) 
      .reader(someReader()) 
      .writer(someWriter()) 
      .build(); 

    return stepBuilderFactory 
      .get("partitionedStepOne") 
      .partitioner(stepOne) 
      .partitioner("partition", partitioner()) 
      .taskExecutor(someExecutor()) 
      .gridSize(SIZE) 
      .build(); 
} 


@Bean 
@Scope(value = "step", proxyMode = ScopedProxyMode.TARGET_CLASS) 
Partitioner partitioner() { 
    return new OffsetBasedPartitioner(NAME, storedArticleMasterDataRepository); 
} 
} // end of job class 
.... 

public class OffsetBasedPartitioner implements Partitioner, StepExecutionListener { 

@Override 
public void beforeStep(StepExecution stepExecution) { 
    ... 
} 
... 
} 

J'éviterais les fichiers de configuration xml si possible.

+2

Je ne Je connais bien JavaConfig, mais je suppose que partitioner() n'est pas automatiquement enregistré en tant qu'auditeur mais que vous devez l'enregistrer manuellement –

+0

merci @LucaBassoRicci, avez-vous une idée de comment faire cela? les annotations sont-elles suffisantes ou ai-je besoin de config xml? –

+1

Je suppose que vous pouvez trouver une méthode listener() dans StepBuilder –

Répondre

0

Merci à @LucaBassoRicci pour sa suggestion, j'ai ajouté le partitionneur comme auditeur dans la définition de l'étape:

return stepBuilderFactory 
     .get("partitionedStepOne") 
     .partitioner(stepOne) 
     .partitioner("partition", partitioner()) 
     .listener(partitioner()) 
     .taskExecutor(someExecutor()) 
     .gridSize(SIZE) 
     .build(); 

et à gauche tout le reste comme ci-dessus, maintenant il fonctionne :)