Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- linux
- css
- java
- 7월 공모주 청약 일정
- 오라클
- MYSQL
- 공모주 청약 일정
- 주식
- 6월 공모주 청약 일정
- 주식 청약 일정
- Oracle
- Stock ipo
- 리눅스
- Eclipse
- 제이쿼리
- php
- 코드이그나이터
- 주식 청약
- 공모주 청약
- IPO
- SQL
- html
- 맥
- Stock
- 자바
- codeigniter
- jquery
- 공모주
- 자바스크립트
- JavaScript
Archives
- Today
- Total
개발자의 끄적끄적
[Java] ScheduledExecutorService를 이용해서 스케줄러를 만들어보자 [펌] 본문
728x90
반응형
[Java] ScheduledExecutorService를 이용해서 스케줄러를 만들어보자 [펌]
ScheduledExecutorService는 concurrent 패키지에 포함되어 있으며, '일정 시간 후' 또는 '주기적'으로 command(작업)를 실행시켜줄 수 있는 녀석이다.
스프링을 사용했다면 간편하게 @Scheduled를 사용했겠지만, 쌩 자바를 쓸 일이 있어서 ScheduledExecutorService를 사용해봤다.
코드 자체가 직관적이기 때문에 거두절미하고 코드를 보자.
import java.time.Duration;
import java.time.ZoneId;
import java.time.ZonedDateTime;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import static java.time.LocalDateTime.now;
import static java.util.concurrent.TimeUnit.SECONDS;
public class Scheduler {
public static final String SEOUL_ZONE = "Asia/Seoul";
public static final int ONE_DAY = 1;
public static final int ONE_DAY_AS_SECOND = 24 * 60 * 60;
public static final int SINGLE_POOL_SIZE = 1;
private final ScheduledExecutorService scheduler;
public Scheduler() {
this.scheduler = Executors.newScheduledThreadPool(SINGLE_POOL_SIZE);
}
public void execute(Runnable command, int hour, int minute, int second) {
ZonedDateTime now = ZonedDateTime.of(now(), ZoneId.of(SEOUL_ZONE));
ZonedDateTime nextExecutionTime = this.getNextExecutionTime(hour, minute, second, now);
scheduler.scheduleAtFixedRate(command, this.getInitialExecutionTime(now, nextExecutionTime), ONE_DAY_AS_SECOND, SECONDS);
}
private ZonedDateTime getNextExecutionTime(int hour, int minute, int second, ZonedDateTime now) {
ZonedDateTime nextExecutionTime;
nextExecutionTime = now
.withHour(hour)
.withMinute(minute)
.withSecond(second);
if (this.isOverDay(now, nextExecutionTime))
nextExecutionTime = nextExecutionTime.plusDays(ONE_DAY);
return nextExecutionTime;
}
private boolean isOverDay(ZonedDateTime zonedNow, ZonedDateTime nextExecutionTime) {
return zonedNow.compareTo(nextExecutionTime) > 0;
}
private long getInitialExecutionTime(ZonedDateTime now, ZonedDateTime nextExecutionTime) {
Duration duration = Duration.between(now, nextExecutionTime);
return duration.getSeconds();
}
}
생성자에서 초기화를 해준다.
현재 시간과 실행 시간을 구한다.
getInitialExecutionTime()을 통해서 두 시간의 차이를 구한다. => 지금부터 실행 시간까지 남은 시간
scheduleAtFixedRate()에 위에서 얻은 결과를 토대로 호출한다.
execute(() -> System.out.println("Hello World"), 7, 0, 0);
위와 같이 호출하게되면 7시마다 Hello World를 출력하게 된다.
반응형
'개발 > java & jsp' 카테고리의 다른 글
[java/spring] 이클립스 힙 메모리 상태 보기 (0) | 2020.09.27 |
---|---|
[java] maven dependency 추가시 유용한 사이트 (방법) [펌] (0) | 2020.09.23 |
[Maven] Dependency (라이브러리) 추가 방법 [펌] (0) | 2020.09.22 |
[java] 자바 자격증 종류 [펌] (0) | 2020.09.22 |
[eclipse] tomcat clean 후 404 에러 (0) | 2020.09.21 |
Comments