SpringBatch ридер + бобовые инъекции - PullRequest
0 голосов
/ 03 декабря 2018

Я пытаюсь внедрить репозиторий в весенний пакетный ридер. Но я получаю «NullPonterException» в одном случае, и он вводит другим способом.

Пожалуйста, посмотрите один раз, почему это происходит так.

Случай: 1 (если в считывателе происходит инъекция)

public class ABCJobLauncher {

@Autowired
public JobBuilderFactory jobBuilderFactory;

@Autowired
public StepBuilderFactory stepBuilderFactory;

@Autowired
private JobLauncher jobLauncher;

@Autowired
private Reader reader;

public JobExecution startJobBatchProcessing(KeyRotationParameters keyRotationParameters) {

    JobExecution jobExecution = null;

    reader.setKeyRotationParameters(keyRotationParameters);


    try {

    Step step1 = stepBuilderFactory.get("step1").<BatchParameters, BatchParameters>chunk(1).reader(reader)
                .processor(processor).writer(writer).build();
    Job jobDetails = getJobdetails(keyRotationParameters.getTenantId(), step1);
        JobParameters jobParameters = new JobParametersBuilder().addLong("time", System.currentTimeMillis())
                .toJobParameters();

        jobExecution = jobLauncher.run(jobDetails, jobParameters);

    } catch (Exception e) {
        e.printStackTrace();

    }

    return jobExecution;
}
}

и соответствующий класс «Reader» равен

 import org.springframework.batch.item.ItemReader;
 import org.springframework.batch.item.NonTransientResourceException;
 import org.springframework.batch.item.ParseException;
 import org.springframework.batch.item.UnexpectedInputException;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;

@Component
public class Reader implements ItemReader<BatchParameters> {

@Autowired
private IRepository repopsitory;


private KeyParameters keyParameters;

public KeyParameters getKeyParameters() {
    return keyParameters;
}

public void setKeyParameters(KeyParameters keyParameters) {
    this.keyParameters = keyParameters;
}

@Override
public BatchParameters read()
        throws Exception, UnexpectedInputException, ParseException, NonTransientResourceException {


    VEntry vEntry = repopsitory.findById(id);

    **********(batchParameters)
            *********

    return batchParameters;

}

}

CASE-2 **** (Там, где в читателе не происходит инъекция)

Предположим, если я создаю новый экземпляр для читателя вместо автоматического подключения в "ABCJobLauncher". Затем внедрение бинав читателе не происходит.

Соответствующий код

 @Component
public class ABCJobLauncher {

@Autowired
public JobBuilderFactory jobBuilderFactory;

@Autowired
public StepBuilderFactory stepBuilderFactory;

@Autowired
private JobLauncher jobLauncher;



public JobExecution startJobBatchProcessing(KeyRotationParameters keyRotationParameters) {

    JobExecution jobExecution = null;

    Reader reader = new Reader();

    reader.setKeyRotationParameters(keyRotationParameters);
    Processor processor = new Processor();
    Writer writer = new Writer();

    try {



        Step step1 = stepBuilderFactory.get("step1").<BatchParameters, BatchParameters>chunk(1).reader(reader)
                .processor(processor).writer(writer).build();

        Job jobDetails = jobBuilderFactory.get(JobName).incrementer(new RunIdIncrementer()).flow(step1).end().build();
        JobParameters jobParameters = new JobParametersBuilder().addLong("time", System.currentTimeMillis())
                .toJobParameters();

        jobExecution = jobLauncher.run(jobDetails, jobParameters);

    } catch (Exception e) {
        e.printStackTrace();

    }

    return jobExecution;
}

Ответы [ 2 ]

0 голосов
/ 03 декабря 2018

Чтобы завершить ответ @Mahmoud, вы можете ввести хранилище, как вы делали в первом примере, и установить его для читателя:

@Autowired
private IRepository repopsitory;
@Component
public class ABCJobLauncher {

@Autowired
public JobBuilderFactory jobBuilderFactory;

@Autowired
public StepBuilderFactory stepBuilderFactory;

@Autowired
private JobLauncher jobLauncher;  

public JobExecution startJobBatchProcessing(KeyRotationParameters keyRotationParameters) {

    JobExecution jobExecution = null;

    Reader reader = new Reader();
    reader.setRepository(repository); // set the repository
    reader.setKeyRotationParameters(keyRotationParameters);
    Processor processor = new Processor();
    Writer writer = new Writer();

    try {



        Step step1 = stepBuilderFactory.get("step1").<BatchParameters, BatchParameters>chunk(1).reader(reader)
                .processor(processor).writer(writer).build();

        Job jobDetails = jobBuilderFactory.get(JobName).incrementer(new RunIdIncrementer()).flow(step1).end().build();
        JobParameters jobParameters = new JobParametersBuilder().addLong("time", System.currentTimeMillis())
                .toJobParameters();

        jobExecution = jobLauncher.run(jobDetails, jobParameters);

    } catch (Exception e) {
        e.printStackTrace();

    }

    return jobExecution;
}
0 голосов
/ 03 декабря 2018

Предположим, если я создаю новый экземпляр для считывателя вместо автоматического подключения в "ABCJobLauncher". Затем в считыватель не внедряется компонент.

Поскольку вы создаете экземпляр считывателя вручную,вам нужно ввести зависимости вручную.Поскольку в этом случае Spring не управляет считывателем, следовательно, внедрение зависимостей не будет выполнено.

Так что в вашем "CASE-2" вам нужно сделать что-то вроде:

IRepository repository = ...; // create instance of IRepository
Reader reader = new Reader();
reader.setRepository(repository); // set the repository
reader.setKeyRotationParameters(keyRotationParameters);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...