아래와 같이 작업을 하는데. 오류를 찾아 보니까 MapJobRegistry 에서 잡을 찾지 못하여 오류가 발생을 하고 잇는데
1. JobRegistry가 하는 역활이 무엇일까요?
2. 다른 분들은 SpringBatch 를 웹에서 컨트롤 하실대 어떤식으로 작업을 하시나요?
매번 질문만 올려 놓고 배우며 가고 있습니다.
고수분들의 조언을 구합니다.
On 11월24일, 오후5시06분, 신승식 <sssin9...@gmail.com> wrote:
> 스프링 배치를 웹화면을 이용하여 배치 결과를 모니터링 하고
> 오류발생시 웹에서 다시 실행 시킬수 있도록 하려고 합니다.
>
> 아래와 같이 Command 단에서 jobOperator를 이용하여
>
> =====================================================
>
> ClassPathXmlApplicationContext classPathXmlApplicationContext = new
> ClassPathXmlApplicationContext(
> new String[] { "simple-job-launcher-context.xml",
> "jobs/CF_EI10000Job.xml" });
>
> SimpleJobOperator oper = (SimpleJobOperator)
> classPathXmlApplicationContext.getBean("jobOperator");
>
> JobParametersBuilder builder = new JobParametersBuilder();
> builder.addString("CORP_SECD", "TI01");
> builder.addString("PROC_STD_YMD", "20090831");
> builder.addDate("START_TIME", new Date());
> builder.toJobParameters();
>
> oper.start("CF_EI10000", builder.toString());
>
> =====================================================
>
> org.springframework.batch.core.launch.NoSuchJobException: No job
> configuration with the name [CF_EI10000] was registered
> at
> org.springframework.batch.core.configuration.support.MapJobRegistry.getJob
> (MapJobRegistry.java:79)
> at
> org.springframework.batch.core.configuration.support.ClassPathXmlJobRegistr-y.getJob
현재 프로젝트에서 스프링 배치2.0을 사용하고 있어서
ClassPathXmlJobRegistry를 사용하여 아래와 같이 허접하게 코딩을 하였습니다.
정상혁님이 JobRegistryBeanPostProcessor를 말씀 하셧는데
사용하는 방법에 대해서 잘 이해가 안되어서 일단 내가 이해 하는 범위에서
프로그램을 돌아가게 하고 코드를 개선하여 보자는 생각으로 아래와 같이 프로그래을하였는데
일단 돌아가게 만들어 놓고 보니
아무리 봐도 코드가 너무 너저분 하네요.. 개념이 잘 잡히지 앟고 코딩을 하려니
어렵군요..
아래 코드 중에서
ApplicationContext에 모든잡 설정파일을 명시하는방법 은
잡이 늘어나면 프로그램도 수정해야 하는 거라서 이런방식은 아닌듯한데요..
다른 개선된 좋은 방법이 없을까요?..
고수님의 조언을 구합니다.
그리고 정상혁님 다시한번 감사 드립니다.
정상혁님이 글을 읽으면서 한발 한발 나가고 있습니다.
=====================================================================
/* vo를 통하여 선태된 JobExecution Id선택 */
String jobExecutionId = vo.getJOB_EXECUTION_ID();
this.logger.debug(" jobExecutionId " + jobExecutionId);
/* ApplicationContext 설정하기 */
ClassPathXmlApplicationContext classPathXmlApplicationContext = new
ClassPathXmlApplicationContext(
new String[] { "simple-job-launcher-context.xml", "jobs/
CF_EI10000Job.xml", "jobs/DD20101BJob.xml" });
/* ApplicationContext 에서 operator 가져오기 */
SimpleJobOperator oper = (SimpleJobOperator)
classPathXmlApplicationContext.getBean("jobOperator");
/* ApplicationContext에서 Job가져오기 */
Job job = (Job) classPathXmlApplicationContext.getBean
("CF_EI10000");
Job DD20101B = (Job) classPathXmlApplicationContext.getBean
("DD20101B");
/* job을 이용하여 잡팩토리 생성 */
ReferenceJobFactory jobfactory = new ReferenceJobFactory(job);
ReferenceJobFactory DD20101Bjobfactory = new ReferenceJobFactory
(DD20101B);
ListableJobRegistry jobRegistry = new MapJobRegistry();
try {
/* registry에 잡팩토리 등록 */
jobRegistry.register(DD20101Bjobfactory);
jobRegistry.register(jobfactory);
/* operator 에 JobRegistry 등록 */
oper.setJobRegistry(jobRegistry);
/* operator 를 이용하여 잡 실행 */
oper.restart(Long.parseLong(jobExecutionId));
=====================================================================
On 11월25일, 오전12시48분, Sanghyuk Jung <bene...@gmail.com> wrote:
> 찾아보니 *ClassPathXmlJobRegistry는 2.1버전에서 depreciate되네요;*
>
> 따로 등록해주는 선언이 필요하지만, 그냥 아래와 같이 JobRegistryBeanPostProcessor를 이용해서
> MapJobRepository를 초기화하는 방법이 나을 것 같습니다; (무심코 넘겼었는데, 제가 참가하고 있는 프로젝트에도 다른 분이
> 이렇게 설정해 놓으셨네요 ^^;)
>
> <bean
> class="org.springframework.batch.core.configuration.support.JobRegistryBeanPostProcessor">
> <property name="jobRegistry" ref="jobRegistry"/>
> </bean>
>
> 역시나 Job인터페이스를 구현한 bean들을 JobRegistry에 등록해줍니다
>
> 2009년 11월 25일 오전 12:11, Sanghyuk Jung <bene...@gmail.com>님의 말:
>
>
>
> > ClassPathXmlJobRegitry를 쓰시면 기본적으로 Job interface를 구현한 모든 bean들을 등록해주는 것으로 알고
> > 있습니다.
>
> > MapJobRegitry는 따로 등록절차 거쳐서 job을 관리할 필요가 있을 때 쓰라고 있는 것 같네요;
>
> > 그리고 웹에서 job을 호출할 때 Job 의 bean id로 직접 application context에서 job을 얻고,
> > jobLauncher를 DI하여 사용하는 방식을 쓰는 프로젝트를 봤었습니다. 그런데 jobOperator를 쓰는 것이 훨씬 유연성이 있을
> > 것 같네요
>
> > OsgiBundleXmlApplicationContextFactory같은 클래스가 존재하는 것보면 Osgi 번들 안에 등록된 job을
> > 불러올수도 있나봅니다.
>
> > 2009년 11월 24일 오후 5:09, 신승식 <sssin9...@gmail.com>님의 말:
> >> org.springframework.batch.core.configuration.support.ClassPathXmlJobRegistr-y.getJob
> >> > (ClassPathXmlJobRegistry.java:63)
> >> > at
> >> > org.springframework.batch.core.launch.support.SimpleJobOperator.start
> >> > (SimpleJobOperator.java:295)
> >> > at kr.co.gnbitec.valuation.cm.bean.BatchJobSearchBean.reRunJob
> >> > (BatchJobSearchBean.java:115)- 원본 텍스트 숨기기 -
>
> - 원본 텍스트 보기 -
허~.....
암튼 내가 남긴 삽질 자국이 누군가에게 도움이 되길 바라는 마음에
삽질 자국을 남깁니다.
추가로 정삭혁님 빨리 책이 나왔으면 좋겠네요..
-----------------------------------------------------
/* ApplicationContext 설정하기 */
ClassPathXmlApplicationContext classPathXmlApplicationContext = new
ClassPathXmlApplicationContext(
new String[] { "simple-job-launcher-context.xml", "jobs/
CF_EI10000Job.xml", "jobs/DD20101BJob.xml",
"jobs/CF_EI10001Job.xml", "jobs/FV10000Job.xml", "jobs/
FV10001Job.xml", });
/* ApplicationContext 에서 operator 가져오기 */
SimpleJobOperator oper = (SimpleJobOperator)
classPathXmlApplicationContext.getBean("jobOperator");
/* operator 를 이용하여 잡 실행 */
oper.restart(Long.parseLong(jobExecutionId));
On 11월26일, 오후5시37분, Sanghyuk Jung <bene...@gmail.com> wrote:
> 아, Job을 그렇게 코드 안에서 하나하나 등록하실 필요는 없구요,
>
> <bean
> class="org.springframework.batch.core.configuration.support.JobRegistryBeanPostProcessor">
> <property name="jobRegistry" ref="jobRegistry"/>
> </bean>
>
> <bean id="jobRegitry" class="....MapJobRegistry">
>
> 이 선언만 들어와 있으면 applicationContext올라가면서 자동으로 jobRegitry에 등록됩니다. jobRegistry를
> DI로 얻으셔서 처음에 올린 소스처럼 쓰시면 될 거 같다는 예상이 드는데요, 혹시 에러가 나면 에러 메시지를 다시 보내주세요~
>
> ClassPathXmlJobRegistry 를 쓰실 때는 jobPaths라는 속성으로 xml파일의 위치를 지정하셔야 되구요.
>
> 2009년 11월 26일 오후 3:58, 신승식 <sssin9...@gmail.com>님의 말:
> > > - 원본 텍스트 보기 -- 원본 텍스트 숨기기 -