Можно создать пакетное задание как @Component, используя вставленный JobBuilderFactory для этого компонента - PullRequest
0 голосов
/ 04 июля 2019

Мне любопытно, можно ли определить Spring Batch Job иным способом, чем создание компонента методом. Можно ли определить пакетное задание, создав @Component, расширяющий Job, и используя внедренный JobBuilderFactory, чтобы создать экземпляр, чтобы избежать реализации всех необходимых методов своими руками?

@Component
public class ImportEmployeeJob extends FlowJob {

private final JobBuilderFactory jobBuilderFactory;
private final FlowStep printProcessedEmployeeFromCsv;

public ImportEmployeeJob(JobBuilderFactory jobBuilderFactory, FlowStep printProcessedEmployeeFromCsv, ApplicationContext context) {
    this.jobBuilderFactory = jobBuilderFactory;
    this.printProcessedEmployeeFromCsv = printProcessedEmployeeFromCsv;

    jobBuilderFactory.get("importEmployeeJob")
            .incrementer(new RunIdIncrementer())
            .listener(new PersonCsvJobExecutionListener())
            .flow(printProcessedEmployeeFromCsv)
            .end()
            .build();
    }

}

Это маленький глупый пример, но я просто хочу показать вам, что я имею в виду

1 Ответ

0 голосов
/ 04 июля 2019

Вы можете использовать фабричный боб для этого. Вот быстрый пример:

import org.springframework.batch.core.Job;
import org.springframework.batch.core.JobParameters;
import org.springframework.batch.core.Step;
import org.springframework.batch.core.configuration.annotation.EnableBatchProcessing;
import org.springframework.batch.core.configuration.annotation.JobBuilderFactory;
import org.springframework.batch.core.configuration.annotation.StepBuilderFactory;
import org.springframework.batch.core.launch.JobLauncher;
import org.springframework.batch.repeat.RepeatStatus;
import org.springframework.beans.factory.FactoryBean;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.annotation.Configuration;
import org.springframework.stereotype.Component;

@Configuration
@EnableBatchProcessing
public class MyJob {

    public static void main(String[] args) throws Exception {
        ApplicationContext context = new AnnotationConfigApplicationContext(MyJob.class);
        JobLauncher jobLauncher = context.getBean(JobLauncher.class);
        Job job = context.getBean(Job.class);
        jobLauncher.run(job, new JobParameters());
    }

    @Component
    public static class MyJobFactoryBean implements FactoryBean<Job> {

        private final JobBuilderFactory jobs;

        private final StepBuilderFactory steps;

        public MyJobFactoryBean(JobBuilderFactory jobs, StepBuilderFactory steps) {
           this.jobs = jobs;
           this.steps = steps;
        }

        @Override
        public Job getObject() {
            Step step = steps.get("step")
                    .tasklet((contribution, chunkContext) -> {
                        System.out.println("hello world");
                        return RepeatStatus.FINISHED;
                    })
                    .build();

            return jobs.get("job")
                    .start(step)
                    .build();
        }

        @Override
        public Class<?> getObjectType() {
            return Job.class;
        }

        @Override
        public boolean isSingleton() {
            return true;
        }
    }

}

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

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