복붙노트

[SPRING] 스프링 부트가 일괄 작업을 실행하는 방법

SPRING

스프링 부트가 일괄 작업을 실행하는 방법

나는 Spring Batch with Boot를 위해이 샘플을 따라 갔다.

main 메소드를 실행하면 작업이 실행됩니다. 이렇게하면 작업 실행을 제어하는 ​​방법을 알 수 없습니다. 예를 들어 작업을 예약하거나 작업 실행에 액세스하거나 작업 매개 변수를 설정하는 방법을 예로들 수 있습니다.

나 자신의 JobLauncher를 등록하려고 시도했다.

@Bean
public JobLauncher jobLauncher(JobRepository jobRepo){
    SimpleJobLauncher simpleJobLauncher = new SimpleJobLauncher();
    simpleJobLauncher.setJobRepository(jobRepo);
    return simpleJobLauncher;
}

하지만 주요 방법으로 사용하려고 할 때 :

public static void main(String[] args) {
    ConfigurableApplicationContext ctx = SpringApplication.run(Application.class, args);    
    JobLauncher jobLauncher = ctx.getBean(JobLauncher.class);
    //try catch removed for readability
    jobLauncher.run(ctx.getBean(Job.class), new JobParameters());   
}

컨텍스트가로드 될 때 작업이 다시 실행되고 수동으로 실행하려고하면 JobInstanceAlreadyCompleteException이 발생합니다. 자동 작업 실행을 방지 할 수있는 방법이 있습니까?

해결법

  1. ==============================

    1.작업 실행은 다음을 설정하여 방지 할 수 있습니다.

    작업 실행은 다음을 설정하여 방지 할 수 있습니다.

    spring.batch.job.enabled=false
    

    application.properties에 있습니다. 또는 spring.batch.job.names를 사용할 수 있습니다. 실행될 작업 이름의 쉼표로 구분 된 목록을 사용합니다.

    여기에서 가져온 것 : 코드를 실행할 때 스프링 배치 작업이 처음 실행되는 것을 어떻게 막을 수 있습니까?

  2. ==============================

    2.나머지 컨트롤러 POST를 사용하여 작업 실행을 활성화 할 수 있습니다.

    나머지 컨트롤러 POST를 사용하여 작업 실행을 활성화 할 수 있습니다.

    @RestController
    @RequestMapping(value="/job/")
    public class JobLauncherController {
    
        private static final Log LOG = LogFactory.getLog(JobLauncherController.class);
    
        @Autowired
        private JobLauncher jobLauncher;
    
        @Autowired
        private Job job;
    
        @Autowired
        private JobRepository jobRepository;
    
        @Autowired
        private JobRegistry jobRegistry;
    
        @RequestMapping("/launchjob/{jobName}")
        public String handle(@PathVariable("jobName") String jobName, @RequestBody Map<String,Object> request) throws Exception {
            try {           
                request.put("timeJobStarted", DateUtil.getDateFormatted(new Date(), DateUtil.DATE_UUUUMMDDHHMMSS));
                Map<String,Object> mapMessage = this.enrichJobMessage(request);
                Map<String, JobParameter> jobParameters = new HashMap<>();
                mapMessage.forEach((k,v)->{
                    MapperUtil.castParameter(jobParameters, k, v);
                });
                jobParameters.put(Field.Batch.JOB_INSTANCE_NAME, new JobParameter(jobName));
                jobLauncher.run(job, new JobParameters(jobParameters));
                assertNotNull(jobRegistry.getJob(job.getName()));
            }catch( NoSuchJobException ex){
                jobRegistry.register(new ReferenceJobFactory(job));
            } catch (Exception e) {
                LOG.error(e.getMessage(),e);
            }
    
            return "Done";
        }
    
    public static void castParameter(Map<String, JobParameter> jobParameters, String k, Object v){
        if(v instanceof String){
            jobParameters.put(k, new JobParameter((String)v));
        }else if(v instanceof Date){
            jobParameters.put(k, new JobParameter((Date)v));
        }else if(v instanceof Double){
            jobParameters.put(k, new JobParameter((Double)v));
        }else if(v instanceof Long){
            jobParameters.put(k, new JobParameter((Long)v));
        }else{
            DslJson dslJson = new DslJson<>();          
            JsonWriter writer = dslJson.newWriter();
            try {
                dslJson.serialize(writer,v);
                jobParameters.put(k, new JobParameter(writer.toString()));
            } catch (IOException e) {
                LOG.warn(e.getMessage(), e);
            }                       
        }
    }
    
    }
    
  3. from https://stackoverflow.com/questions/23447948/how-spring-boot-run-batch-jobs by cc-by-sa and MIT license