๐ก ScheduledExecutorService๊ณผ SpringBoot์ @Scheduled๋ก ์ค์ผ์ค๋ง์ ์ค์ ํ ์ ์๋ค.
- ScheduledExecutorService์ ์ธ์์๋ ๋ฉ์๋์๋ ์ ์ฉํ ์ ์์ง๋ง @Scheduled๋ ์ธ์์๋ ๋ฉ์๋์ ์ ์ฉ์ด ๋ถ๊ฐํ๋ค.
ScheduledExecutorService
- Java 1.5๋ถํฐ ์ง์๋๋ ์ค์ผ์ค๋ง์ด ๊ฐ๋ฅํ Executor ์๋น์ค๋ก ์ธํฐํ์ด์ค์ด๋ฉฐ, ๊ตฌํ์ฒด๋ก ScheduledThreadPoolExecutor()๊ฐ ์๋ค.
- ์์ ์ฝ๋
@Service
@RequiredArgsConstructor
@Transactional
public class BattleRivalService {
private final BattleRepository battleRepository;
private final BattleRivalRepository battleRivalRepository;
private final TeamRepository teamRepository;
private final BattleService battleService;
private final ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
public BattleRivalResponseDTO saveBattleRival(Battle battle, TeamMember teamMember) {
LocalDate lc = LocalDate.now();
LocalDateTime finishTime = LocalDateTime.now().plusDays(7);
BattleRival result = battleRivalRepository.findByTeamId(teamMember.getTeam().getId());
// ํ์ด ๋๊ฒฐ์ ์ฐธ์ฌํ์ง ์์ ๊ฒฝ์ฐ
if(result == null) {
BattleRival battleRival = new BattleRival(battle, teamMember.getTeam());
battleRivalRepository.save(battleRival);
battle.update(lc);
battleRepository.save(battle);
Team team = teamRepository.findById(battle.getBattleRivals().get(0).getTeam().getId()).orElse(null);
team.updateState("๋๊ฒฐ ์งํ ์ค");
teamRepository.save(team);
team = teamRepository.findById(teamMember.getTeam().getId()).orElse(null);
team.updateState("๋๊ฒฐ ์งํ ์ค");
teamRepository.save(team);
scheduler.schedule(() -> {
try {
battleService.finishBattle(battle.getId());
} catch (ParseException e) {
throw new RuntimeException(e);
}
}, ChronoUnit.SECONDS.between(LocalDateTime.now(), finishTime), TimeUnit.SECONDS);
return BattleRivalResponseDTO.builder()
.teamId(battleRival.getTeam().getId())
.teamName(battleRival.getTeam().getName())
.peopleNum(battleRival.getTeam().getPeopleNum())
.step(battleRival.getStep())
.build();
} else {
// ํ์ด ๋๊ฒฐ์ ์ฐธ์ฌํ ๊ฒฝ์ฐ
return null;
}
}
@Scheduled
- ์คํ๋ง ๋ถํธ์์๋ ์ค์ผ์ค๋ง ์ธํฐํ์ด์ค๋ฅผ ์ง์ ๊ตฌํํ ํ์๊ฐ ์๋ค.
- @EnableScheduling ์ด๋ ธํ ์ด์ ์ผ๋ก ์ค์ผ์ค๋ง์ ์ฌ์ฉํ๊ฒ ๋ค๋ ๊ฒ์ ๋ช ์ํ๊ณ , @Scheduled ์ด๋ ธํ ์ด์ ์ผ๋ก ์ค์ผ์ค๋ง ํ ํจ์๋ฅผ ์ง์ ํด์ฃผ๋ฉด ๋๋ค.
@EnableScheduling
@SpringBootApplication
public class WalkingMateBackApplication {
public static void main(String[] args) {
SpringApplication.run(WalkingMateBackApplication.class, args);
}
}
- ์ค์ ์ค์ผ์ค๋ง ์์
ํ ํด๋์ค๋ฅผ ๋ง๋ ๋ค.
@Component(@Service ๋ฑ) ์ฆ, ์คํ๋ง ๋น์ ๋ฑ๋ก๋ ํด๋์ค์ฌ์ผ ํ๋ค. ์ด๋ ๊ฒ ๋ ๊ฐ์ ์ด๋ ธํ ์ด์ ์ ์ ๊ธฐ๋ง ํ๋ฉด ์ค์ ์ ๋์ด๊ณ ๋ค์ ๊ท์น์ ์งํค๋ฉฐ ์ค์ผ์ค๋ฌ ๋ฉ์๋๋ฅผ ๋ง๋ค์.@Service public class SchedulerService { @Scheduled(fixedDelay = 1000) // 1์ด๋ง๋ค ์คํ public void run() { System.out.println("Hello CoCo World!); } }
- @Scheduled ๊ท์น
- Method๋ void ํ์ ์ผ๋ก
- Method๋ ๋งค๊ฐ๋ณ์ ์ฌ์ฉ ๋ถ๊ฐ
- @Scheduled ๊ท์น
@Scheduled ์์ฑ
fixedDelay : milliseconds ๋จ์๋ก, ์ด์ Task์ ์ข ๋ฃ ์์ ์ผ๋ก๋ถํฐ ์ ์๋ ์๊ฐ๋งํผ ์ง๋ ํ Task๋ฅผ ์คํํ๋ค.
@Scheduled(fixedDelay = 1000)
public void run() {
System.out.println("Hello CoCo World!");
}
fixedDelayString : fixedDelay์ ๊ฐ์๋ฐ ๋ฌธ์์ด๋ก ๊ฐ์ ํํํ๊ฒ ๋ค๋ ์๋ฏธ์ด๋ค.
@Scheduled(fixedDelay = "1000")
public void run() {
System.out.println("Hello CoCo World!");
}
fixedRate : milliseconds ๋จ์๋ก, ์ด์ Task์ ์์ ์์ ์ผ๋ก๋ถํฐ ์ ์๋ ์๊ฐ๋งํผ ์ง๋ ํ Task๋ฅผ ์คํํ๋ค.
@Scheduled(fixedRate = 1000)
public void run() {
System.out.println("Hello CoCo World!");
}
fixedRateString : fixedRate์ ๊ฐ์๋ฐ ๋ฌธ์์ด๋ก ๊ฐ์ ํํํ๊ฒ ๋ค๋ ์๋ฏธ์ด๋ค.
@Scheduled(fixedRateString = "1000")
public void run() {
System.out.println("Hello CoCo World!");
โป fixedDelay vs fixedRate
fixedRate๋ ์์
์ํ์๊ฐ๊ณผ ์๊ด์์ด ์ผ์ ์ฃผ๊ธฐ๋ง๋ค ๋ฉ์๋๋ฅผ ํธ์ถํ๋ ๊ฒ์ด๊ณ ,
fixedDelay๋ (์์
์ํ ์๊ฐ์ ํฌํจํ์ฌ) ์์
์ ๋ง์น ํ๋ถํฐ ์ฃผ๊ธฐ ํ์ด๋จธ๊ฐ ๋์ ๋ฉ์๋๋ฅผ ํธ์ถํ๋ ๊ฒ์ด๋ค.
initialDelay : ์ค์ผ์ค๋ฌ์์ ๋ฉ์๋๊ฐ ๋ฑ๋ก๋์๋ง์ ์ํํ๋ ๊ฒ์ด ์๋ ์ด๊ธฐ ์ง์ฐ์๊ฐ์ ์ค์ ํ๋ ๊ฒ์ด๋ค.
@Scheduled(fixedRate = 5000, initialDelay = 3000)
public void run() {
System.out.println("Hello CoCo World!");
}
์์ ๊ฐ์ด ์ฌ์ฉํ๋ฉด 3์ด์ ๋๊ธฐ์๊ฐ(initialDelay) ํ์ 5์ด(fixedRate)๋ง๋ค "Hello CoCo World!"๋ฅผ ์ถ๋ ฅํ๋ ์์ ์ ์ค์ผ์ค๋ฌ๊ฐ ์ํํด์ค๋ค.
initialDelayString : ์์ ๋ง์ฐฌ๊ฐ์ง๋ก ๋ฌธ์์ด๋ก ๊ฐ์ ํํํ๊ฒ ๋ค๋ ์๋ฏธ์ด๋ค.
@Scheduled(fixedRate = 5000, initialDelayString = "3000")
public void run() {
System.out.println("Hello CoCo World!");
cron : Cron ํํ์์ ์ฌ์ฉํ์ฌ ์์ ์ ์์ฝํ ์ ์๋ค.
@Scheduled(cron = "* * * * * *")
public void run() {
System.out.println("Hello CoCo World!");
}
์ฒซ ๋ฒ์งธ * ๋ถํฐ ์ด(0-59), ๋ถ(0-59), ์๊ฐ(0-23), ์ผ(1-31), ์(1-12), ์์ผ(0-6) (0: ์ผ, 1: ์, 2:ํ, 3:์, 4:๋ชฉ, 5:๊ธ, 6:ํ ), Spring @Scheduled cron์ 6์๋ฆฌ ์ค์ ๋ง ํ์ฉํ๋ฉฐ ์ฐ๋ ์ค์ ์ ํ ์ ์๋ค.
- Cron ํํ์
-
- : ๋ชจ๋ ์กฐ๊ฑด(๋งค์, ๋งค์ผ, ๋งค์ฃผ์ฒ๋ผ ์ฌ์ฉ)์ ์๋ฏธ
- ? : ์ค์ ๊ฐ ์์ (๋ ์ง์ ์์ผ์์๋ง ์ฌ์ฉ ๊ฐ๋ฅ)
- '-' : ๋ฒ์๋ฅผ ์ง์ ํ ๋
- , : ์ฌ๋ฌ ๊ฐ์ ์ง์ ํ ๋
- / : ์ฆ๋ถ๊ฐ, ์ฆ ์ด๊ธฐ๊ฐ๊ณผ ์ฆ๊ฐ์น ์ค์ ์ ์ฌ์ฉ
- L : ๋ง์ง๋ง - ์ง์ ํ ์ ์๋ ๋ฒ์์ ๋ง์ง๋ง ๊ฐ ์ค์ ์ ์ฌ์ฉ (๋ ์ง์ ์์ผ์์๋ง ์ฌ์ฉ ๊ฐ๋ฅ)
- W : ๊ฐ์ฅ ๊ฐ๊น์ด ํ์ผ(weekday)์ ์ค์ ํ ๋
- ์) 10W
- 10์ผ์ด ํ์ผ ์ผ ๋ : 10์ผ์ ์คํ
- 10์ผ์ด ํ ์์ผ ์ผ ๋ : ๊ฐ์ฅ ๊ฐ๊น์ด ํ์ผ์ธ ๊ธ์์ผ(9์ผ)์ ์คํ
- 10์ผ์ด ์ผ์์ผ ์ผ ๋ : ๊ฐ์ฅ ๊ฐ๊น์ด ํ์ผ์ธ ์์์ผ(11์ผ)์ ์คํ
- ์) 10W
- '#' : N๋ฒ์งธ ์ฃผ ํน์ ์์ผ์ ์ค์ ํ ๋ (-์์ผ์์๋ง ์ฌ์ฉ ๊ฐ๋ฅ)
- ์) 4#2
- ๋ชฉ์์ผ#2์งธ์ฃผ์ ์คํ
-
zone : cron ํํ์์ ์ฌ์ฉํ์ ๋ ์ฌ์ฉํ time zone์ผ๋ก ๋ฐ๋ก ์ค์ ํ์ง ์์ผ๋ฉด ๊ธฐ๋ณธ์ ์ผ๋ก Local์ time zone์ด๋ค.
@Scheduled(cron = "* * * * * *", zone = "Asia/Seoul")
public void run() {
System.out.println("Hello CoCo World!");
}
cron ์ฌ์ฉ ์์
// ๋งค์ผ ์คํ 18์์ ์คํ
@Scheduled(cron = "0 0 18 * * *")
public void run() {
System.out.println("Hello CoCo World!");
}
// ๋งค๋ฌ 10์ผ,20์ผ 14์์ ์คํ
@Scheduled(cron = "0 0 14 10,20 * ?")
public void run() {
System.out.println("Hello CoCo World!");
}
// ๋งค๋ฌ ๋ง์ง๋ง๋ 22์์ ์คํ
@Scheduled(cron = "0 0 22 L * ?")
public void run() {
System.out.println("Hello CoCo World!");
}
// 1์๊ฐ ๋ง๋ค ์คํ ex) 01:00, 02:00, 03:00 ...
@Scheduled(cron = "0 0 0/1 * * *")
public void run() {
System.out.println("Hello CoCo World!");
}
// ๋งค์ผ 9์00๋ถ-9์55๋ถ, 18์00๋ถ-18์55๋ถ ์ฌ์ด์ 5๋ถ ๊ฐ๊ฒฉ์ผ๋ก ์คํ
@Scheduled(cron = "0 0/5 9,18 * * *")
public void run() {
System.out.println("Hello CoCo World!");
}
// ๋งค์ผ 9์00๋ถ-18์55๋ถ ์ฌ์ด์ 5๋ถ ๊ฐ๊ฒฉ์ผ๋ก ์คํ
@Scheduled(cron = "0 0/5 9-18 * * *")
public void run() {
System.out.println("Hello CoCo World!");
}
// ๋งค๋ฌ 1์ผ 10์30๋ถ์ ์คํ
@Scheduled(cron = "0 30 10 1 * *")
public void run() {
System.out.println("Hello CoCo World!");
}
// ๋งค๋
3์๋ด ์-๊ธ 10์30๋ถ์ ์คํ
@Scheduled(cron = "0 30 10 ? 3 1-5")
public void run() {
System.out.println("Hello CoCo World!");
}
// ๋งค๋ฌ ๋ง์ง๋ง ํ ์์ผ 10์30๋ถ์ ์คํ
@Scheduled(cron = "0 30 10 ? * 6L")
public void run() {
System.out.println("Hello CoCo World!");
}
์ถ์ฒ : https://dev-coco.tistory.com/176
'Web & Android > SpringBoot' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[SpringBoot] REST API (0) | 2023.10.13 |
---|---|
[SpringBoot] Bean (0) | 2023.10.13 |
[SpringBoot] Google ์ด๋ฉ์ผ ์ธ์ฆ (0) | 2023.09.12 |
[SpringBoot] Lombok (1) | 2023.08.18 |
[SpringBoot] HTTP form์์ put, delete ์ฌ์ฉ๋ฒ (0) | 2023.08.17 |