배치에서 EgovBatchRunner에 대해 궁금한점이 있습니다.
- 작성자 :
- 설*수
- 작성일 :
- 2014-08-18 09:59:09
- 조회수 :
- 1,152
- 구분 :
- 실행환경
- 진행상태 :
- 완료
Q
ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext(xmlLocations, false);
ctx.refresh();
EgovBatchRunner egovBatchRunner = (EgovBatchRunner) ctx.getBean("egovBatchRunner");
// 파라메터 취득.
jobParametersBuilder.addLong("timestamp", new Date().getTime());
String jobParameters = egovBatchRunner.convertJobParametersToString(jobParametersBuilder.toJobParameters());
// Job 실행.
long executionId = egovBatchRunner.start(jobName, jobParameters);
// Job 결과 취득.
BatchStatus resultStatus = egovBatchRunner.getJobExecution(executionId).getStatus();
현재 이런식으로 배치를 실행을 개발하고 있는데요.
배치템플릿을 분석하다보니까 EgovSchedulerRunner(egovframework.rte.bat.core.launch.support.EgovSchedulerRunner)라는 스케쥴러 클래스를 보게되었습니다.
이 클래스에서는
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(locations, false);
context.refresh();
이렇게 실행하고
// 설정한 시간만큼 대기하고, 그 사이에 Scheduler가 수행된다.
Thread.sleep(delayTime);
context.close(); // 종료
이런식으로 구동되더라구요.
제가궁금한것은 마지막부분인데요.
제가 EgovBatchRunner으로 job을 실행시키잖아요.
1. job이 끝나자마자 무언가를 하고싶은데, 꼭 Thread.sleep(delayTime)를 주고, 딜레이시간이끝나면 처리하도록 구현해야하나요?
Thread.sleep(delayTime)을 주지않았을때 순서가 뒤죽박죽되는거는 확인했는데.. 혹시나 다른방법이 있는지 궁금하구요.
2. context.close() (ClassPathXmlApplicationContext)를 꼭 해줘야하는것인지 궁금합니다.
(웹에서 ajax을 이용하여, 수동으로 job실행후 결과를 받아야되는데 Thread.sleep(delayTime)때문에 브라우저가 멈춰있는 현상이있어서...)
제가 질문을 깔끔하게 하지못해서 이해가 잘 되실지모르겠네요.
답변주시면 감사하겠습니다!!
수고하십시요~~
ctx.refresh();
EgovBatchRunner egovBatchRunner = (EgovBatchRunner) ctx.getBean("egovBatchRunner");
// 파라메터 취득.
jobParametersBuilder.addLong("timestamp", new Date().getTime());
String jobParameters = egovBatchRunner.convertJobParametersToString(jobParametersBuilder.toJobParameters());
// Job 실행.
long executionId = egovBatchRunner.start(jobName, jobParameters);
// Job 결과 취득.
BatchStatus resultStatus = egovBatchRunner.getJobExecution(executionId).getStatus();
현재 이런식으로 배치를 실행을 개발하고 있는데요.
배치템플릿을 분석하다보니까 EgovSchedulerRunner(egovframework.rte.bat.core.launch.support.EgovSchedulerRunner)라는 스케쥴러 클래스를 보게되었습니다.
이 클래스에서는
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(locations, false);
context.refresh();
이렇게 실행하고
// 설정한 시간만큼 대기하고, 그 사이에 Scheduler가 수행된다.
Thread.sleep(delayTime);
context.close(); // 종료
이런식으로 구동되더라구요.
제가궁금한것은 마지막부분인데요.
제가 EgovBatchRunner으로 job을 실행시키잖아요.
1. job이 끝나자마자 무언가를 하고싶은데, 꼭 Thread.sleep(delayTime)를 주고, 딜레이시간이끝나면 처리하도록 구현해야하나요?
Thread.sleep(delayTime)을 주지않았을때 순서가 뒤죽박죽되는거는 확인했는데.. 혹시나 다른방법이 있는지 궁금하구요.
2. context.close() (ClassPathXmlApplicationContext)를 꼭 해줘야하는것인지 궁금합니다.
(웹에서 ajax을 이용하여, 수동으로 job실행후 결과를 받아야되는데 Thread.sleep(delayTime)때문에 브라우저가 멈춰있는 현상이있어서...)
제가 질문을 깔끔하게 하지못해서 이해가 잘 되실지모르겠네요.
답변주시면 감사하겠습니다!!
수고하십시요~~
A
안녕하세요. 설연수님.
배치를 실행(launch)을 하는 방법으로는 3가지 방법이 있습니다.
(egovframework.rte.bat.core.launch.support.*)
- EgovCommandLineRunner : cron 등과 같은 외부 command line 방식으로 배치를 기동할 때 사용
- EgovSchedulerRunner : Quartz와 같은 scheduler에 의해 기동할 때 사용
- EgovBatchRunner : 직접적으로 통제하여 기동할 때 사용
EgovBatchRunner는 자체적으로 ApplicationContext를 갖지 않고, 예제로 올려주신 것 처럼 외부에서 정의된 것으로 injection 방식으로 호출하는 방식이고, 나머지 2개는 내부에 ApplicationContext를 생성하여 호출하는 방식입니다. (둘다 Servlet Container가 아닌 자체 프로세스 호출 방식)
1. job 이후에 특정 처리를 하시는 경우에는 sleep()을 이용하시는 것이 아니라 job 자체의 step 상에 처리 로직을 구현하는 방식으로 배치 job을 구성하셔야 합니다.
서로 의존적인 처리에 대하여 sleep()으로 순서를 지정하시는 경우는 job 처리 시간이 정해져 있지 않기 때문에 문제가 될 수 있습니다.
2. close()도 매번 호출하실 필요가 없습니다. 최종 종료시점에 close()가 처리되는 것으로
- EgovCommandLineRunner의 경우 cron 등에 호출되는 java command가 매번 종료되는 방식이기 때문에 종료 전 close()를 처리하고 있고,
- EgovSchedulerJobRunner도 종료 시전에 close()를 처리하고 있습니다.
추가적으로 웹에서 job을 호출하시는 경우라면, EgovBatchRunner를 통해 호출하시면 됩니다. 이 경우 sleep() 처리가 없기 때문에 브라우저 멈춤 등이 없습니다.
해당 처리에 대한 에제는 Batch Template 중 Web 방식을 생성하셔서 참조하시면 되실 것 같습니다.
그럼, 즐거운 하루되십시오.
감사합니다.
배치를 실행(launch)을 하는 방법으로는 3가지 방법이 있습니다.
(egovframework.rte.bat.core.launch.support.*)
- EgovCommandLineRunner : cron 등과 같은 외부 command line 방식으로 배치를 기동할 때 사용
- EgovSchedulerRunner : Quartz와 같은 scheduler에 의해 기동할 때 사용
- EgovBatchRunner : 직접적으로 통제하여 기동할 때 사용
EgovBatchRunner는 자체적으로 ApplicationContext를 갖지 않고, 예제로 올려주신 것 처럼 외부에서 정의된 것으로 injection 방식으로 호출하는 방식이고, 나머지 2개는 내부에 ApplicationContext를 생성하여 호출하는 방식입니다. (둘다 Servlet Container가 아닌 자체 프로세스 호출 방식)
1. job 이후에 특정 처리를 하시는 경우에는 sleep()을 이용하시는 것이 아니라 job 자체의 step 상에 처리 로직을 구현하는 방식으로 배치 job을 구성하셔야 합니다.
서로 의존적인 처리에 대하여 sleep()으로 순서를 지정하시는 경우는 job 처리 시간이 정해져 있지 않기 때문에 문제가 될 수 있습니다.
2. close()도 매번 호출하실 필요가 없습니다. 최종 종료시점에 close()가 처리되는 것으로
- EgovCommandLineRunner의 경우 cron 등에 호출되는 java command가 매번 종료되는 방식이기 때문에 종료 전 close()를 처리하고 있고,
- EgovSchedulerJobRunner도 종료 시전에 close()를 처리하고 있습니다.
추가적으로 웹에서 job을 호출하시는 경우라면, EgovBatchRunner를 통해 호출하시면 됩니다. 이 경우 sleep() 처리가 없기 때문에 브라우저 멈춤 등이 없습니다.
해당 처리에 대한 에제는 Batch Template 중 Web 방식을 생성하셔서 참조하시면 되실 것 같습니다.
그럼, 즐거운 하루되십시오.
감사합니다.