[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.작업 실행은 다음을 설정하여 방지 할 수 있습니다.
작업 실행은 다음을 설정하여 방지 할 수 있습니다.
spring.batch.job.enabled=false
application.properties에 있습니다. 또는 spring.batch.job.names를 사용할 수 있습니다. 실행될 작업 이름의 쉼표로 구분 된 목록을 사용합니다.
여기에서 가져온 것 : 코드를 실행할 때 스프링 배치 작업이 처음 실행되는 것을 어떻게 막을 수 있습니까?
-
==============================
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); } } } }
from https://stackoverflow.com/questions/23447948/how-spring-boot-run-batch-jobs by cc-by-sa and MIT license
'SPRING' 카테고리의 다른 글
[SPRING] CRUDRespository의 업데이트 또는 SaveUpdate, 사용 가능한 옵션이 있습니까? (0) | 2019.01.11 |
---|---|
[SPRING] Spring 데이터 나머지 - 여러 속성별로 정렬 (0) | 2019.01.11 |
[SPRING] Spring 보안은 보안 주석 구성에서 url 패턴을 제외합니다. (0) | 2019.01.11 |
[SPRING] Spring-data-mongodb는 하나의 Mongo 인스턴스에서 여러 데이터베이스에 연결합니다. (0) | 2019.01.11 |
[SPRING] hbm.xml을 사용하는 대신 Hibernate 엔티티에 대한 패키지를 검사하는 방법은 무엇입니까? (0) | 2019.01.11 |