[Spring] Quartz ์ค์ผ์ค๋ฌ ๋ฑ๋ก/ SchedulerFactoryBean
๐ SchedulerFactoryBean ์ ํตํ Quartz ์ค์ผ์ค๋ฌ ๋ฑ๋ก
๐ SchedulerFactoryBean ์ด๋?
Quartz org.quartz.Scheduler ๋ฅผ ์์ฑ ๋ฐ ์ค์ ํ๊ณ , ์คํ๋ง ์ ํ๋ฆฌ์ผ์ด์ ์ปจํ ์คํธ์ ์ผ๋ถ๋ก ๋ผ์ดํ์ฌ์ดํด์ ๊ด๋ฆฌํ๋ฉฐ, ์ข ์์ฑ ์ฃผ์ ์ ์ํ ๋น ์ฐธ์กฐ๋ก ์ค์ผ์ค๋ฌ๋ฅผ ๋ ธ์ถํ๋ FactoryBean. ์์ ์ธ๋ถ ์ ๋ณด, ์บ๋ฆฐ๋ ๋ฐ ํธ๋ฆฌ๊ฑฐ๋ฅผ ๋ฑ๋กํ ์ ์์ผ๋ฉฐ, ์ด๊ธฐํ ์ ์ค์ผ์ค๋ฌ๋ฅผ ์๋์ผ๋ก ์์ํ๊ณ ํ๊ดด ์ ์ข ๋ฃํ ์ ์์ต๋๋ค.
> ์ฆ, ์์ฑ ํ๋ฉด ์คํ๋ง์ด ์์์ ๊ด๋ฆฌํด์ค๋ค!
"์คํ๋ง์ IoC ์ปจํ ์ด๋์ ์ํด ๋น์ผ๋ก ์์ฑ๋๋ฉด, ์คํ๋ง์ด ํด๋น ๋น์ ๋ผ์ดํ์ฌ์ดํด์ ๊ด๋ฆฌํ๋ฏ๋ก ๊ฐ๋ฐ์๋ ์ค์ผ์ค๋ฌ์ ์์ฑ, ์ด๊ธฐํ, ์์, ์ข ๋ฃ ๋ฑ์ ์์ ์ ์๋์ผ๋ก ์ฒ๋ฆฌํ ํ์๊ฐ ์์ต๋๋ค."
IoC ์ปจํ ์ด๋์ ์ข ๋ฅ
์คํ๋ง์์๋ ์ฌ๋ฌ ๊ฐ์ง IoC ์ปจํ ์ด๋๋ฅผ ์ ๊ณตํ๋ฉฐ, ์ผ๋ฐ์ ์ผ๋ก ApplicationContext ๋ฅผ ๊ฐ์ฅ ๋ง์ด ์ฌ์ฉ
BeanFactory | ๊ฐ์ฅ ๊ธฐ๋ณธ์ ์ธ IoC ์ปจํ ์ด๋๋ก, ์ง์ฐ ์ด๊ธฐํ(lazy loading) ๋ฐฉ์์ผ๋ก ๊ฐ์ฒด๋ฅผ ์์ฑํจ. |
ApplicationContext | BeanFactory๋ฅผ ํ์ฅํ ์ปจํ ์ด๋๋ก, ๋ถ๊ฐ์ ์ธ ๊ธฐ๋ฅ (AOP, ํธ๋์ญ์ , ๋ฉ์์ง์์ค ๋ฑ) ์ ์ง์ํจ. |
WebApplicationContext | ์น ์ ํ๋ฆฌ์ผ์ด์ ํ๊ฒฝ์์ ์ฌ์ฉ๋๋ IoC ์ปจํ ์ด๋. |
๐น SchedulerFactoryBean๊ณผ IoC ์ปจํ ์ด๋์ ๊ด๊ณ
๐ก SchedulerFactoryBean์ ApplicationContext์ ์ํด ๊ด๋ฆฌ๋๋ ํ๋์ ๋น(Bean) ์
๋๋ค.
์ฆ, ์คํ๋ง IoC ์ปจํ
์ด๋๊ฐ SchedulerFactoryBean์ ์๋ช
์ฃผ๊ธฐ๋ฅผ ์๋์ผ๋ก ๊ด๋ฆฌํ๋ฏ๋ก, ๊ฐ๋ฐ์๊ฐ ์ง์ Scheduler ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ณ ์ข
๋ฃํ ํ์ ์์ด ์คํ๋ง์ด ์์์ ์์ฑํ๊ณ ์๋ฉธ์์ผ ์ค๋๋ค.
Quartz ๋ฅผ ํตํ ์ค์ผ์ค๋ฌ ์ค์ ๋ฐฉ๋ฒ ๊ธฐ๋ก ํ์ผ๋ฉฐ ์ค์ ์ ๋ฌด์ ์ฌ์ฉ๋๋ ์คํ ๋ก์ง์(Job) ์ํ๋ ๊ธฐ๋ฅ์ ๋ณ๋์ ํด๋์คํ์ผ์ ๊ตฌํํ๋ฉด๋จ. โก๏ธ ์ค์ผ์ค๋ฌ๊ฐ ์คํํ ๋ก์ง
์ฌ๊ธฐ์๋ Myjob.class๋ก ๋์ค๋ฉฐ, ํฌ์คํ ์ ๋ชฉ์ ์ด ์ค์ผ์ค๋ฌ ๋ฑ๋ก์ด๋ฏ๋ก ์๋น์ค ๋ก์ง(ex_์ฟ ํฐ ๋๋ฝ ํ์ธ ๊ธฐ๋ฅ ๋ฑ)์ ์๋ตํ์์ต๋๋ค.
1. pom.xml ์์กด์ฑ ์ฃผ์
<!-- quartz -->
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz</artifactId>
<version>2.3.0</version>
</dependency>
2. Quartz ์ค์ผ์ค๋ฌ ๋ฑ๋ก
์์ ํ์ผ : TestQuartzConfiguration.java
Quartz ์ค์ผ์ค๋ฌ๋ฅผ 3๊ฐ์ง ์์๋ก ๊ตฌ์ฑํด๋ณด๋ฉด Scheduler & ์คํ๋ด์ฉ์ธ Job & Job์ ์คํํ Trigger ์ด๋ค.
( Job ํด๋์ค ๊ตฌํ → JobDetail ๋น ๋ฑ๋ก → Trigger ๋น ๋ฑ๋ก → Scheduler ๋น์ Trigger ๋ฑ๋ก )
์ค์ผ์ค๋ฌ๋ฅผ ๋น์ผ๋ก ๋ฑ๋ก ํ ๋ ์๋ฐ ๊ธฐ๋ฐ์ผ๋ก ์ค์ ํด์ฃผ์๋ค. Spring์ @Configuration ์ด๋ ธํ ์ด์ ์ผ๋ก ์ค์ ํด๋์ค๋ฅผ ์ ์ ํ๊ณ , @Bean ์ด๋ ธํ ์ด์ ์ผ๋ก SchedulerFactoryBean์ ์ ์ํด ์ค์ผ์ค๋ฌ๋ฅผ ๋น์ผ๋ก ๋ฑ๋กํ๋ค. ์ด๋ ๊ฒ ์์ฑ๋ ์ค์ผ์ค๋ฌ๋ Spring ์ปจํ ์คํธ์ ์ผ๋ถ๋ก ๊ด๋ฆฌ๋๋ฉฐ, ์๋์ผ๋ก ์ด๊ธฐํ๋๊ณ ์ ํ๋ฆฌ์ผ์ด์ ์ข ๋ฃ ์ ์๋์ผ๋ก ์ข ๋ฃ๋๋ค.
์๋ ์ฝ๋๋ฅผ ๋ฐ๋ผ๊ฐ๋ฉฐ ์์ (Job)๊ณผ ํธ๋ฆฌ๊ฑฐ(Trigger)๋ฅผ ์ค์ ํ๋ ์ฝ๋๋ฅผ ๋ณด๋ฉด JobDetailFactoryBean์ผ๋ก Job ์คํ ์ ๋ณด๋ฅผ ์ ์ํ๊ณ , CronTriggerFactoryBean์ ํฌ๋ก ํํ์์ ๊ธฐ๋ฐ์ผ๋ก ํธ๋ฆฌ๊ฑฐ(์ธ์ ์คํ๋ ์ง)๋ฅผ ์ค์ ํ๋ค.
2-1. ๋จ์ผ Job ์ค์ผ์ค๋ฌ ๋ฑ๋ก ์์
@Configuration
public class TestQuartzConfiguration {
private static final Logger logger = LoggerFactory.getLogger(QuartzConfiguration.class);
@Resource(name = "messageSource")
protected MessageSource primusProperties; // ๊ฐ์ธ ์ค์ ํ์ผ ์ฐ๋ ํ์๋ฉด ๋ฉ๋๋ค.
// โ JobDetail ๋น ์์ฑ - ์คํํ Quartz ์์
์ ๋ณด ์ค์
@Bean(name = "firstJobDetail")
public JobDetailFactoryBean firstJobDetail() {
JobDetailFactoryBean factoryBean = new JobDetailFactoryBean();
factoryBean.setJobClass(MyJob.class); // ์คํํ Job ํด๋์ค ์ง์
factoryBean.setDescription("Sample Quartz Job"); // ์ค๋ช
์ค์
factoryBean.setDurability(true); // ์์
๋ด๊ตฌ์ฑ ์ ์ง (์ค์ผ์ค๋ฌ ์ฌ์์ ์ ์ ์ง)
return factoryBean;
}
// โก CronTrigger ๋น ์์ฑ - JobDetail ์ฃผ์
๋ฐ์ ํธ๋ฆฌ๊ฑฐ ์ค์ผ์ค๋ง ์ค์
@Bean(name = "firstCronTrigger")
public CronTriggerFactoryBean firstCronTrigger(@Qualifier("firstJobDetail") JobDetail jobDetail) {
CronTriggerFactoryBean trigger = new CronTriggerFactoryBean();
trigger.setJobDetail(jobDetail); // ์คํํ ์์
์ฐ๊ฒฐ
trigger.setCronExpression("0 0/1 * * * ?"); // 1๋ถ๋ง๋ค ์คํํ๋ ํฌ๋ก ํํ์
trigger.setMisfireInstruction(CronTrigger.MISFIRE_INSTRUCTION_DO_NOTHING); // ์ฌ์์ ์ ๋๋ฝ ๋ฐฉ์ง
return trigger;
}
// โข SchedulerFactoryBean ๋น ์์ฑ - ํธ๋ฆฌ๊ฑฐ ์ฃผ์
๋ฐ์ ์ค์ผ์ค๋ฌ ๋ฑ๋ก ๋ฐ ์คํ
@Bean
public SchedulerFactoryBean schedulerFactoryBean(@Qualifier("firstCronTrigger") Trigger firstCronTrigger) {
// ๋ฐฐ์น ์คํ ์ฌ๋ถ ํ๋กํผํฐ ์กฐํ
String batchYn = primusProperties.getMessage("Batch_Server_Yn", null, Locale.getDefault());
logger.info(" - > ํด๋น ์๋ฒ๋ ๋ฐฐ์น ์ฌ๋ถ๊ฐ '{}'์
๋๋ค.", batchYn);
Properties quartzProperties = new Properties();
quartzProperties.setProperty("org.quartz.threadPool.threadCount", "1"); // ์ค๋ ๋ ํ ํฌ๊ธฐ 1๋ก ์ ํ (์ฑ๊ธ์ค๋ ๋)
SchedulerFactoryBean schedulerFactory = new SchedulerFactoryBean();
// ๋ฐฐ์น ์๋ฒ์ผ ๊ฒฝ์ฐ์๋ง ์ค์ผ์ค๋ฌ ๋ฑ๋ก ๋ฐ ์คํ
if ("Y".equals(batchYn)) {
schedulerFactory.setQuartzProperties(quartzProperties); // Quartz ์ค์ ์ ์ฉ
schedulerFactory.setTriggers(firstCronTrigger); // ํธ๋ฆฌ๊ฑฐ ๋ฑ๋ก
}
return schedulerFactory;
}
}
2-2. ๋ค์ค Job๊ณผ Trigger๋ฅผ ํ Config์์ ๋ฑ๋กํ๋ ์์
- JobDetail๊ณผ CronTrigger๋ฅผ ๊ฐ๊ฐ ์ฌ๋ฌ ๊ฐ ์์ฑํด์ ์ด๋ฆ์ผ๋ก ๊ตฌ๋ถํฉ๋๋ค. -> ์ฌ๊ธฐ์๋ first, seconf ๋ก ๊ตฌ๋ถ
- SchedulerFactoryBean์์ ์ฌ๋ฌ Trigger๋ฅผ ๋ฐฐ์ด ํํ๋ก ํ๊บผ๋ฒ์ ๋ฑ๋กํฉ๋๋ค.
- @Qualifier๋ก ์ํ๋ ๋น์ ์ ํํ ์ฃผ์ ํฉ๋๋ค.
@Configuration
public class MultiQuartzConfiguration {
@Resource(name = "messageSource")
protected MessageSource primusProperties;
// ์ฒซ ๋ฒ์งธ JobDetail
@Bean(name = "jobDetailOne")
public JobDetailFactoryBean jobDetailOne() {
JobDetailFactoryBean factory = new JobDetailFactoryBean();
factory.setJobClass(MyJobOne.class);
factory.setDescription("์ฒซ ๋ฒ์งธ Job");
factory.setDurability(true);
return factory;
}
// ์ฒซ ๋ฒ์งธ CronTrigger (1๋ถ๋ง๋ค ์คํ)
@Bean(name = "cronTriggerOne")
public CronTriggerFactoryBean cronTriggerOne(@Qualifier("jobDetailOne") JobDetail jobDetail) {
CronTriggerFactoryBean trigger = new CronTriggerFactoryBean();
trigger.setJobDetail(jobDetail);
trigger.setCronExpression("0 0/1 * * * ?");
trigger.setMisfireInstruction(CronTrigger.MISFIRE_INSTRUCTION_DO_NOTHING);
return trigger;
}
// ๋ ๋ฒ์งธ JobDetail
@Bean(name = "jobDetailTwo")
public JobDetailFactoryBean jobDetailTwo() {
JobDetailFactoryBean factory = new JobDetailFactoryBean();
factory.setJobClass(MyJobTwo.class);
factory.setDescription("๋ ๋ฒ์งธ Job");
factory.setDurability(true);
return factory;
}
// ๋ ๋ฒ์งธ CronTrigger (5๋ถ๋ง๋ค ์คํ)
@Bean(name = "cronTriggerTwo")
public CronTriggerFactoryBean cronTriggerTwo(@Qualifier("jobDetailTwo") JobDetail jobDetail) {
CronTriggerFactoryBean trigger = new CronTriggerFactoryBean();
trigger.setJobDetail(jobDetail);
trigger.setCronExpression("0 0/5 * * * ?");
trigger.setMisfireInstruction(CronTrigger.MISFIRE_INSTRUCTION_DO_NOTHING);
return trigger;
}
// SchedulerFactoryBean - ๋ ํธ๋ฆฌ๊ฑฐ ๋ชจ๋ ๋ฑ๋ก
@Bean
public SchedulerFactoryBean schedulerFactoryBean(
@Qualifier("cronTriggerOne") Trigger cronTriggerOne,
@Qualifier("cronTriggerTwo") Trigger cronTriggerTwo) {
String batchYn = primusProperties.getMessage("Batch_Server_Yn", null, Locale.getDefault());
Properties quartzProps = new Properties();
quartzProps.setProperty("org.quartz.threadPool.threadCount", "1");
SchedulerFactoryBean scheduler = new SchedulerFactoryBean();
if ("Y".equals(batchYn)) {
scheduler.setQuartzProperties(quartzProps);
scheduler.setTriggers(cronTriggerOne, cronTriggerTwo);
}
return scheduler;
}
}
@Configuration๊ณผ @Bean์ ์กฐํฉ์ ์คํ๋ง์ ํต์ฌ์ ์ธ ์ค์ ๋ฉ์ปค๋์ฆ์ ์ ๊ณตํ๋ฉฐ, ํนํ ํ๋ก์๋ฅผ ํตํ ์ฑ๊ธํค ๋ณด์ฅ์ด ๊ฐ๋ฅํด์ง๋๋ค.
@Bean ๋ฉ์๋์ ์ญํ : ์ปจํ ์ด๋๋ @Bean ์ด๋ ธํ ์ด์ ์ด ๋ถ์ ๋ฉ์๋๋ฅผ ์ฐพ์ ํด๋น ๋ฉ์๋๊ฐ ๋ฐํํ๋ ๊ฐ์ฒด๋ฅผ Spring ์ ํ๋ฆฌ์ผ์ด์ ์ปจํ ์คํธ์ ๋น์ผ๋ก ๋ฑ๋กํฉ๋๋ค.
โ ์ปจํ ์ด๋๊ฐ ๋น์ ๋ฑ๋กํ๊ณ ๊ด๋ฆฌํ๋ ๊ณผ์ ์ ๋ํด์ ํท๊ฐ๋ฆฐ๋ค๋ฉด ์๋ ๋ธ๋ก๊ทธ๋ฅผ ์ถ์ฒํ๋ฉฐ ์ถ์ฒ ๋จ๊น๋๋ค.
- ๋จผ์ @Configuration์ด ๋ถ์ ํด๋์ค๋ฅผ ์ฐพ์ต๋๋ค. ์ด ํด๋์ค๋ค์ด ์ค์ ์ ๋ณด๋ฅผ ๋ด๊ณ ์์ต๋๋ค.
- ๊ทธ๋ค์ @Component, @Controller, @Service, @Repository ๋ฑ์ ์ด๋ ธํ ์ด์ ์ด ๋ถ์ ํด๋์ค๋ค์ ์ฐพ์์ ๋น์ผ๋ก ๋ฑ๋กํฉ๋๋ค.
- @Bean์ด ๋ถ์ ๋ฉ์๋๋ค์ ์ฐพ์ ๊ทธ ๋ฉ์๋๊ฐ ๋ฐํํ๋ ๊ฐ์ฒด๋ค๋ ๋น์ผ๋ก ๋ฑ๋กํฉ๋๋ค.
- ์ด๋ ๊ฒ ๋ฑ๋ก๋ ๋น๋ค์ ์์กด๊ด๊ณ๋ฅผ ๋ถ์ํ๊ณ ํ์ํ ๊ฒฝ์ฐ ์๋์ผ๋ก ์ฃผ์ ํด ์ค๋๋ค.
โ ์ถ์ฒ: https://curiousjinan.tistory.com/entry/deep-dive-spring-container-configuration-and-bean#๋น์ ๋ฒ์(Scope)๋%3F-1 [์ค๋๋ ๊ฐ๋ฐ์ค์ ๋๋ค:ํฐ์คํ ๋ฆฌ]
3. Job.class ์์ฑ
์ ์ค์ ํ์ผ ์์ค์์ factoryBean.setJobClass(MyJob.class); ์ ๊ฐ์ด job์ ์ง์ ํด์ฃผ์๊ธฐ ๋๋ฌธ์ MyJob.class๋ผ๋ ์ด๋ฆ์ผ๋ก ์๋น์ค ๋ก์ง ํด๋์ค๋ฅผ ์์ฑํ๋ฉด ๋๋ค.
QuartzJobBean์ ์์ํ๋ฉด executeInternal๋ง ๊ตฌํํ๋ฉด ๋๊ธฐ ๋๋ฌธ์, Spring๊ณผ์ ํตํฉ์ด ์ฌ์์ง๊ณ Job ๊ตฌํ์ด ๊ฐ๋จํด์ง๋ค.
(์๋น์ค ๋ก์ง์ด๋? ๋ฐ๋ณต๋ฌธ์ ๋๋ฉฐ db๋ฅผ ์กฐํํ์ฌ ์ฟ ํฐ์ ๋ฐ๊ธํ๋ค ๋ฑ๋ฑ. ์ค์ผ์ค๋ฌ๊ฐ ์คํ๋๋ฉฐ ์ํํด์ผ ํ ๋ก์ง์ ์์ฑ.)
MyJob.clas ์์
package com.batch.job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.scheduling.quartz.QuartzJobBean;
import com.batch.config.QuartzConfiguration;
public class MyJob extends QuartzJobBean {
private static final Logger logger = LoggerFactory.getLogger(QuartzConfiguration.class);
@Override
protected void executeInternal(JobExecutionContext context) throws JobExecutionException {
// TODO Auto-generated method stub
logger.info("myJob์ด ์คํ๋ฉ๋๋ค.");
}
}
โ Scheduler ๋ฑ๋ก ๋ฐฉ๋ฒ์ ๋ํ ์ถ๊ฐ ๋ฉ๋ชจ
์ค์ผ์ค๋ฌ๋ Quartz์ ํต์ฌ ์ธํฐํ์ด์ค๋ก, ์ก(Job)์ ์ค์ผ์ค๋งํ๊ณ ๊ด๋ฆฌํ๋ ์ญํ ์ ํ๋ค.
Quartz ์ค์ผ์ค๋ฌ์์ Scheduler๋ฅผ ์ธ์คํด์คํํ๊ณ ์ฌ์ฉํ๋ ๋ํ์ ์ฌ์ฉ๋ฒ์ด ๋๊ฐ์ง๊ฐ ์๋๋ฐ
์ฒซ์งธ, StdSchedulerFactory ๋ก ์ง์ ์ธ์คํด์คํ ํด ์ฌ์ฉํ๋ ๊ฒ์ด๊ณ
๋์งธ, ์ด ํฌ์คํ ์ ์ค๋ช ํ ๋ด์ฉ์ผ๋ก SchedulerFactoryBean ์ ์ฌ์ฉํ์ฌ ์ค์ผ์ค๋ฌ๋ฅผ Spring ์ปจํ ์คํธ์ Bean์ผ๋ก ๋ฑ๋กํ๊ณ , ๊ด๋ฆฌํ๋ ๋ฐฉ๋ฒ์ด๋ค.
๋๋ฒ์งธ ๋ฐฉ๋ฒ์ด ๋ ์ฝ๊ฒ ์ค์ผ์ค๋ง ์์ ์ ์ค์ ํ๊ณ ๊ด๋ฆฌํ ์ ์๋ค๊ณ ํ์ฌ ์ฌ์ฉํ๋๋ฐ ์ค์ ๋ก ์ฝ๋ ์์ฑ ๊ตฌ์กฐ๊ฐ ๋จ์ผํ ๋๊ธฐ ๋๋ฌธ์ ๋ค๋ฅธ ์ฌ๋์ด ์์ฑํ ์ฝ๋๋ฅผ ์์๋ณด๊ธฐ๋ ์ฌ์ด ๊ฒ ๊ฐ๋ค.
โ StdSchedulerFactory
* StdSchedulerFactory๋ฅผ ์ฌ์ฉํ์ฌ ์ง์ Scheduler ์ธ์คํด์คํ ํ๋ ๋ฐฉ๋ฒ.
์ด ํฉํ ๋ฆฌ๋ ๋ด๋ถ์ ์ผ๋ก Quartz ์ค์ ํ์ผ์ ์ฝ์ด ์ค์ผ์ค๋ฌ๋ฅผ ์ด๊ธฐํ ํจ.
import org.quartz.*;
import org.quartz.impl.StdSchedulerFactory;
public class QuartzStdSchedulerExample {
public static void main(String[] args) {
try {
// SchedulerFactory๋ฅผ ํตํด ๊ธฐ๋ณธ Scheduler ์ธ์คํด์ค๋ฅผ ์์ฑํฉ๋๋ค.
Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();
scheduler.start();
// ์์
(Job) ์ ์
JobDetail job = JobBuilder.newJob(MyJob.class)
.withIdentity("myJob", "group1")
.build();
// ํธ๋ฆฌ๊ฑฐ ์ ์ (10์ด๋ง๋ค ์คํ)
Trigger trigger = TriggerBuilder.newTrigger()
.withIdentity("myTrigger", "group1")
.startNow()
.withSchedule(SimpleScheduleBuilder.simpleSchedule()
.withIntervalInSeconds(10)
.repeatForever())
.build();
// ์ค์ผ์ค๋ฌ์ ์์
๊ณผ ํธ๋ฆฌ๊ฑฐ๋ฅผ ์ค์ผ์ค๋ง
scheduler.scheduleJob(job, trigger);
// ๋ค๋ฅธ ์์
์ถ๊ฐ ๋๋ ์ค์ผ์ค๋ฌ ์ ์ง ์์
์ํ...
// ์ค์ผ์ค๋ฌ ์ข
๋ฃ (ํ์ํ ๋)
scheduler.shutdown(true);
} catch (SchedulerException se) {
se.printStackTrace();
}
}
}
โก SchedulerFactoryBean
* Spring์ SchedulerFactoryBean์ ํตํด Quartz ์ค์ผ์ค๋ฌ๋ฅผ ๊ด๋ฆฌํ๋ฉฐ, ์ด ๋ฐฉ์์ Spring ์ ํ๋ฆฌ์ผ์ด์ ๋ด์์ Quartz ์์ ์ ํตํฉ ๊ด๋ฆฌํ๊ธฐ์ ์ ํฉํจ.
Spring ApplicationContext ๊ฐ ์์๋ ๋, SchedulerFactoryBean์ด ์๋์ผ๋ก Quartz ์ค์ผ์ค๋ฌ๋ฅผ ์ด๊ธฐํํ๊ณ ์์ํ๋ค. Spring์ด ์ค์ผ์ค๋ฌ์ ์๋ช ์ฃผ๊ธฐ๋ฅผ ๊ด๋ฆฌํ๋ฏ๋ก, ๋ณ๋์ ์ฝ๋๋ก ์ค์ผ์ค๋ฌ๋ฅผ ์์ํ๊ฑฐ๋ ์ข ๋ฃํ ํ์๊ฐ ์๋ค.
SchedulerFactoryBean
FactoryBean that creates and configures a Quartz org.quartz.Scheduler, manages its lifecycle as part of the Spring application context, and exposes the Scheduler as bean reference for dependency injection. Allows registration of JobDetails, Calendars and T
docs.spring.io