[Spring] Scheduler + WebClient Hello ~
ITWeb/개발일반 2020. 4. 9. 15:09필요한 Dependency)
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-quartz'
implementation 'org.springframework.boot:spring-boot-starter-web'
implementation 'org.springframework.boot:spring-boot-starter-webflux'
}
Main Application 에서 @EnableScheduling 을 작성 해 주시면 아주 쉽게 Annotation 설정 만으로 사용 하실 수 있습니다.
예제는 아래 문서 보시면 너무 쉽게 되어 있습니다.
https://spring.io/guides/gs/scheduling-tasks/
추가적인 내용을 조금 더 작성 하자면,
- fixedDelay
실행 시간을 포함해서 완료 된 이후 타이머가 동작 하는 방식 입니다.
- fixedRate
실행 시간 상관 없이 그냥 지정된 타이머 주기로 동작 하는 방식 입니다.
결국, 실행 시간이 길 경우 중복 실행이 될 수 있습니다.
- PeriodicTrigger
특정 주기에 맞춰서 실행 됩니다.
fixedRate 과 유사한 방식 이라고 보시면 됩니다.
- CronTrigger
cron 설정 주기에 맞춰서 실행 됩니다.
저는 그냥 Web Service 형태로 해서 구성을 해서 아래와 같이 적용했습니다.
Scheduler 에 대한 Abstract 를 만들어서 사용했습니다. (구글링 해보면 예제 코드 많이 나옵니다.)
@PostConstruct
public void init() {
this.startScheduler();
}
@Override
public void runner() {
String response = WebClient
.create(watcherEndpointHost)
.method(HttpMethod.POST)
.uri(watcherEndpointUri)
.contentType(MediaType.APPLICATION_JSON)
.accept(MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML)
.acceptCharset(Charset.forName("UTF-8"))
.body(BodyInserters.fromValue(getCheckQuery()))
.exchange()
.block()
.bodyToMono(String.class)
.block();
logger.debug("{}", response);
}
@Override
public Trigger getTrigger() {
return new PeriodicTrigger(10, TimeUnit.SECONDS);
}
@Override
public String getCheckQuery() {
...중략...
return checkQuery;
}
GenericScheduler 를 Singleton 으로 만들어서 Abstract 를 하나 구성했습니다.
public void startScheduler() {
GenericScheduler.getInstance()
.schedule(getRunnable(), getTrigger());
}
public void stopScheduler() {
GenericScheduler.getInstance().shutdown();
}
private Runnable getRunnable(){
return new Runnable(){
@Override
public void run() {
runner();
}
};
}
public abstract void runner();
public abstract Trigger getTrigger();
public abstract String getCheckQuery();
대략적인 구성은 아래 처럼 나옵니다.
@SpringBootApplication
@EnableScheduling
public class MegatoiMonitorWatcherApplication { ... }
public class GenericScheduler { ... }
public abstract class AbstractGenericScheduler { ... }
@Component
public class WatcherCpuChecker extends AbstractGenericScheduler { ... }