étape Spring Batch ne pas exécuter

Legendary_Hunter:

Je travaille sur un projet de traitement par lots de printemps où je lis une liste des élèves, le traitement et l'écrire.

Pour l'instant, je l'ai gardé simple et le traitement retourne juste l'étudiant et de l'écriture imprime juste.

Je me attendais à chaque fois, l'étape passe je verrai la sortie mais je vois qu'une seule fois lors de l'exécution de l'étape pour la première fois. Ci-dessous la sortie

2020-04-03 01:33:16.153  INFO 14710 --- [           main] o.s.batch.core.job.SimpleStepHandler     : Executing step: [xxxx]
[Student{id=1, name='ABC'}]
as
[Student{id=2, name='DEF'}]
as
[Student{id=3, name='GHI'}]
as
2020-04-03 01:33:16.187  INFO 14710 --- [           main] o.s.batch.core.step.AbstractStep         : Step: [xxxx] executed in 33ms
2020-04-03 01:33:16.190  INFO 14710 --- [           main] o.s.b.c.l.support.SimpleJobLauncher      : Job: [SimpleJob: [name=readStudents]] completed with the following parameters: [{}] and the following status: [COMPLETED] in 52ms
job triggered
2020-04-03 01:33:17.011  INFO 14710 --- [   scheduling-1] o.s.b.c.l.support.SimpleJobLauncher      : Job: [SimpleJob: [name=readStudents]] launched with the following parameters: [{time=1585857797003}]
2020-04-03 01:33:17.017  INFO 14710 --- [   scheduling-1] o.s.batch.core.job.SimpleStepHandler     : Executing step: [xxxx]
2020-04-03 01:33:17.022  INFO 14710 --- [   scheduling-1] o.s.batch.core.step.AbstractStep         : Step: [xxxx] executed in 4ms
2020-04-03 01:33:17.024  INFO 14710 --- [   scheduling-1] o.s.b.c.l.support.SimpleJobLauncher      : Job: [SimpleJob: [name=readStudents]] completed with the following parameters: [{time=1585857797003}] and the following status: [COMPLETED] in 11ms

Je remarque aussi que première fois il n'y a pas de paramètres dans l'emploi et après qu'il ya des paramètres. Alors que je suis fournit des paramètres de travail chaque fois que je cours d'emploi.

fichier de configuration

@EnableBatchProcessing
public class Config {

  private JobRunner jobRunner;

  public Config(JobRunner jobRunner){
    this.jobRunner = jobRunner;
  }

  @Scheduled(cron = "* * * * * *")
  public void scheduleJob() throws JobParametersInvalidException, JobExecutionAlreadyRunningException, JobRestartException, JobInstanceAlreadyCompleteException {
    System.out.println("job triggered");
    jobRunner.runJob();
  }
}
@Configuration
public class JobConfig {
  @Bean
  public Job job(JobBuilderFactory jobBuilderFactory,
                 StepBuilderFactory stepBuilderFactory,
                 ItemReader<Student> reader,
                 ItemProcessor<Student, Student> processor,
                 ItemWriter<Student> writer) {

    Step step = stepBuilderFactory.get("xxxx")
        .<Student, Student>chunk(1)
        .reader(reader)
        .processor(processor)
        .writer(writer)
        .build();

    return jobBuilderFactory
        .get("readStudents")
        .start(step)
        .build();
  }

  @Bean
  public ItemReader<Student> reader() {
    return new InMemoryStudentReader();
  }
}

fichier coureur d'emploi

public class JobRunner {

  private Job job;
  private JobLauncher simpleJobLauncher;

  @Autowired
  public JobRunner(Job job, JobLauncher jobLauncher) {
    this.simpleJobLauncher = jobLauncher;
    this.job = job;
  }


  public void runJob() throws JobParametersInvalidException, JobExecutionAlreadyRunningException, JobRestartException, JobInstanceAlreadyCompleteException {
    JobParameters jobParameters =
        new JobParametersBuilder()
            .addLong("time",System.currentTimeMillis()).toJobParameters();
    simpleJobLauncher.run(job, jobParameters);

  }
}

Dans le lecteur étudiant de mémoire

public class InMemoryStudentReader implements ItemReader<Student> {

  private int nextStudentIndex;
  private List<Student> studentData;

  public InMemoryStudentReader() {
    initialize();
  }

  private void initialize() {
    Student s1 = new Student(1, "ABC");
    Student s2 = new Student(2, "DEF");
    Student s3 = new Student(3, "GHI");

    studentData = Collections.unmodifiableList(Arrays.asList(s1, s2,s3));
    nextStudentIndex = 0;
  }

  @Override
  public Student read() throws Exception {
    Student nextStudent = null;

    if (nextStudentIndex < studentData.size()) {
      nextStudent = studentData.get(nextStudentIndex);
      nextStudentIndex++;
    }

    return nextStudent;
  }
}
La question:

Parce que vous appelez initialize()dans le InMemoryStudentReaderconstructeur. Printemps seulement une fois initialize InMemoryStudentReader fil à votre travail. Après la première manche, nextStudentIndexn'est pas remis à 0. Donc , la prochaine fois que votre parcours d'emploi, votre lecteur ne peut pas lire plus.

Si vous voulez travailler, vous devez réinitialiser le nextStudentIndexà 0 à chaque fois que vous démarrez votre travail.

Je suppose que tu aimes

Origine http://10.200.1.11:23101/article/api/json?id=403135&siteId=1
conseillé
Classement