>>> 작업 클래스 : 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 |