Как я могу сделать параметризованную работу? - PullRequest
0 голосов
/ 15 ноября 2018

Я пытаюсь отправить параметры своему читателю.

public JpaPagingItemReader<Person> reader(@Value("#{jobParameters['PersonId']}")
String id){
    JpaPagingItemReader<Person> reader = new JpaPagingItemReader<Person>();
    reader.setEntityManagerFactory(emf);
    reader.setQueryString("SELECT p from "+Person.class.getName()+" p where Id = "+id);
    reader.setPageSize(10);
    return reader;
}

Это, в свою очередь, потребовало бы, чтобы параметр происходил из методов шага и задания.

@Bean
public Step step(String id){
    return stepBuilder.get("step").<Person,Person>chunk(100).reader(reader(id))
        .processor(processor())
        .writer(writer()).build();
}

@Bean
public Job personJob(String id){
    return jobBuilder.get("personJob").incrementer(new RunIdIncrementer()).flow(step(id)).end().build(); 
}

Мой основной метод реализует CommandLineRunner, а метод run переопределяется следующим образом -

@Override
public void run(String... args) throws Exception {
    JobParameters parameters = new JobParametersBuilder()
        .addString("PersonId", "1")
        .toJobParameters();
    jobLauncher.run(job, parameters);
}

Приведенный выше метод не примет jobParameters, поскольку jobLauncher.run(job,parameters) ожидает, что job не имеет аргументов, но не принимает jobLauncher.run(job(id),parameters).

Ошибка, полученная как -

Parameter 0 of method personJob in com.example.JobConfig required a bean of type 'java.lang.String' that could not be found.

Есть ли способ получить id в моем ридере?

Ответы [ 2 ]

0 голосов
/ 15 ноября 2018

Ваш читатель должен быть ограничен, чтобы иметь возможность вводить параметры задания:

@Bean
@StepScope
public JpaPagingItemReader<Person> reader(@Value("#{jobParameters['PersonId']}") String id){
   JpaPagingItemReader<Person> reader = new JpaPagingItemReader<Person>();
   reader.setEntityManagerFactory(emf);
   reader.setQueryString("SELECT p from "+Person.class.getName()+" p where Id = "+id);
   reader.setPageSize(10);
   return reader;
}

Это объясняется в разделе StepScope справочной документации.

Вам не нужно распространять идентификатор в сигнатуре методов step и job bean, вы можете передать null следующим образом:

@Bean
public Step step() {
   return stepBuilder.get("step")
    .<Person,Person>chunk(100)
    .reader(reader(null))
    .processor(processor())
    .writer(writer())
    .build();
}

@Bean
public Job personJob(){
    return jobBuilder.get("personJob")
       .incrementer(new RunIdIncrementer())
       .flow(step())
       .end()
       .build(); 
}

Наконец, ваш run метод верен, там нечего менять.

Надеюсь, это поможет.

0 голосов
/ 15 ноября 2018

Вы получаете это исключение, потому что public Step step(String id) эквивалентно public Step step(@Autowired String id), и у вас не определен String Bean в контексте.

Для передачи идентификатора из объекта JobParameters необходимо объявить компонент JobParameters jobParameters и либо использовать @Value("#{jobParameters['PersonId']}", либо непосредственно компонент jobParameters.

Я не знаком с Spring Batch, но я думаю, что config должен быть похож на что-то вроде этого:

@Configuration
public class PersonJobConfig {

    @Bean
    public JobParameters jobParameters() {
        return new JobParametersBuilder().addString("PersonId", "1").toJobParameters();
    }

    @Bean
    public Step step(JobParameters jobParameters){
        return stepBuilder.get("step").<Person,Person>chunk(100).reader(reader(jobParameters.getString("PersonId"))
            .processor(processor())
            .writer(writer()).build();
    }

    @Bean
    public Job personJob(JobParameters jobParameters){
        return jobBuilder.get("personJob").incrementer(new RunIdIncrementer()).flow(step(jobParameters.getString("PersonId"))).end().build(); 
    }

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...