본문 바로가기

프로그래밍/Web

[spring] batch 작업관련 요소들

>>> 작업 클래스 : QuartzJobBean 을 상속

public class TestJob extends QuartzJobBean {

     

     protected void executeInternal( JobExecutionContext context) {

 

     }

}

 

 

>>> 작업 클래스에 대한 bean 설정

JobDetailBean

멤버 변수 등은 map을 통해 설정한다.

 

<bean id="scheduleJob" class="org.springframework.scheduling.quartz.JobDetailBean">

  <property name="jobClass" vlaue="com.my.package.TestJob" />

  <property name="jobDataAsMap">

     <map>

         <entry key="멤버명" value-ref="값"/>

     </map>

   </property>

</bean>

 

 

 

>>>트리거 : 스케줄링의 시간관련 설정이 이루어지는 녀석

SimpleTriggerBean, CronTriggerBean 

 

미리세컨드 단위의 주기 설정

<bean id="simpleTrigger" class="org.springframework.scheduling.quartz.SimpleTriggerBean">

  <property name="jobDetail" ref="scheduleJob" />

  <property name="startDelay" value="1000" />

  <property name="repeatInterval" value="1000" />

</bean>

 

년단위의 큰 주기의 설정

cronExpression : 주기설정 value="초 분 시 일 월 요일 년

/ : 시작과 증가값 ( 0/10 0에 시작해 10씩 증가)

* : 모든값

? : 특정 값 없음

L : 마지막값 (일의 경우 마지막 날, 월의 경우 12월 등)

, : 중복 지정 ( 0 0 3,5 * * ? 3시와 5시 등..)

 

<bean id="cronTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean">

   <property name="jobDetail" ref="scheduleJob">

   <property name="cronExpression" value="0 0 5 * * ?"/>

</bean>

위의 경우 매월,매일 5시에 쏨!!!

 

5시에 10분마다 쏘는 경우는?  / 사용 => 0 0/10 5 * * ?

 

 

>>> 트리거를 사용한 스케쥴러

SchedulerFactoryBean

 

<bean id="scheduler" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">

  <property name="triggers">

     <list>

        <ref bean="simpleTrigger" />

        <ref bean="cronTrigger" />

     </list>

   </property>

</bean>

 

 

 

 

>>> 배치 작업을 위한 런처

여러 작업을 진행하기위해 각각의 스케줄러를 등록할 수도 있겠지만

하나의 스케줄에 여러 작업이 진행되어야 하는 경우가 있다.

 

이럴때 Job 과 JobLauncher를 사용해 작업을 처리하게 된다.

 

>>> JobLauncher

<bean id="jobLauncher"

    class="org.springframework.batch.core.launch.support.SimpleJobLauncher">

    <property name="jobRepository" ref="jobRepository" />

</bean>

 

 

<bean id="jobRepository"

   class="org.springframework.batch.core.repository.support.MapJobRepositoryFactoryBean">

   <property name="validateTransactionState" value="false" />

   <property name="transcationManager" ref="transactionManager" />

</bean>

 

<bean id="transcationManager"

    class="org.springframework.batch.support.transaction.ResourcelessTransactionManager" />

 

 

>>> Job

실제 작업이 되며, SimpleJob을 상속받아 구성한다.

 

<bean id="simpleJob"

    class="org.springframework.batch.core.job.SimpleJob"

    abstract="true">

    <property name="jobRepository" ref="jobRepository" />

</bean>

 

 

>>> Job에도 여러 작업이 등록될 수 있다.

SimpleJob을 사용한 배치 작업

<beans:beans

    xmlns="http://www.springframework.org/schema/batch"

    xmlns:beans="http//www.springframework.org/schema/beans"

    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

    xsi:schemaLocation="http://www.springframework.org/schema/batch

    http://www.springframework.org/schema/batch/spring-batch-2.1.xsd

    http://www.springframework.org/schema/beans

    http://www.springframework.org/schema/beans/spring-beans-3.1.xsd" >

 

<job id="batchJob" parent="simpleJob">

   <step id="firstStep" parent="taskletStep">

      <tasklet>

           <beans:bean class="com.my.package.TestBatch">

                <beans:property name="message" value="hello world~" />

           </beans:bean>

 

       <listeners>

             <listener>

                 <beans:bean class="com.my.package.TestListener" />

             </listener>

        </listeners>

     </step>

</job>

</beans:beans>

 

 

 

>>> 배치 작업 시 각각의 태스크

public class TestBatch implements InitializaingBean, Tasklet {

    String message="";

 

    public void setMessage( String msg ) {

       message = msg;

    }

 

 

    public void afterPropertieSet() throws Exception {

 

    }

 

    public RepeatStatus execute( StepContribution arg0, ChunkContext arg1 ) throws Exception {

        return RepeatStatus.FINISHED;

    }

}

 

 

 

 

 

>>> 배치작업 스케줄링

스케줄러를 이용해 위의 배치 작업을 구동 시키기...

 

스케줄러를 통해 QuartzJobBean 이 구동되고, 이때 배치 작업(Job)과 런처(JobLauncher)를

전달받는다.

 

 

TestJob 클래스에 launcher 와 작업을 실행 하도록 설정.

 

<bean id="scheduleJob" class="org.springframework.scheduling.quartz.JobDetailBean">

  <property name="jobClass" vlaue="com.my.package.TestJob" />

  <property name="jobDataAsMap">

     <map>

         <entry key="jobLauncher" value-ref="jobLauncher"/>

         <entry key="job" value-ref="batchJob"/>

     </map>

   </property>

</bean>

 

 

public class TestJob extends QuartzJobBean {

     JobLauncher jobLauncher;

     Job job;

 

     public void setJobLauncher( JobLauncher job ) {

         jobLauncher = job;

     }

 

     public void setJob( Job job ) {

        this.job = job;

     }

 

     protected void executeInternal( JobExecutionContext context) {

     }

}

 

 

>> executeInternal()

 

// 파라미터가 필요하면 입력

JobParametersBuilder jobBuilder = new JobParametersBuilder();

jobBuilder.addData( "date" , new Date() );

 

// job 실행

JobExecution exe = jobLauncher.run( job, jobParametersBuilder.toJobParameters());

 

 

 

 

 

>>> 기타

>>> 특정 메쏘드 호출용 bean

MethodInvokingJobDetailFactoryBean

위의 작업 클래스가 아닌 일반 클래스를 호출해야 하는 경우에 사용

 

concurrent 필드는 작업이 끝나야 또다른 작업이 시작됨을 설정

 

<bean id="job" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">

   <property name="targetObject" ref="myTest" />

   <property name="targetMehod" value="run" />      

 

   <property name="concurrent" value="false" /> 

</bean>

 

<bean id="myTest" class="com.my.package.Test" />

 

>>> 특정 메쏘드 주기적 호출용 bean

MethodInvokingTimerTaskFactoryBean

<bean id="job" class="org.springframework.scheduling.timer.MethodInvokingTimerTaskFactoryBean">

   <property name="targetObject" ref="myTest" />

   <property name="targetMethod" value="run" />

</bean>

 

<bean id="myTest" class="com.my.package.Test" />

'프로그래밍 > Web' 카테고리의 다른 글

Gradle Wrapper  (0) 2017.03.06
스프링 요청/응답  (0) 2017.02.26
JPA 쿼리 이것저것  (0) 2017.02.22
[spring] 프로퍼티 값 읽기  (0) 2017.02.21
[spring] 핸들러 인터셉터  (0) 2017.01.24
[spring] Spring boot 기본 설정  (0) 2017.01.24
[spring] JAVA코드 테스트를 위한 Spring설정  (0) 2012.09.25
[MyBatis] 기본 사용법  (0) 2012.05.13
톰캣  (0) 2012.05.10
[spring] dispatch servlet 기본  (0) 2011.05.13