Spring
웹에서 핸드폰으로 메세지 보내기 - 2
yuno82
2024. 2. 5. 21:57
이전에 실제 메세지 보내는건 완료하였다
그렇다면 매일 특정한 시간마다 메세지가 전달되도록 코드를 작성해야 하는데
우선 테스트용 코드를 작성했다
@Scheduled
import org.springframework.scheduling.annotation.Scheduled;
@Service
public class SmsService {
@Scheduled(fixedRate = 5000) // 5초마다 실행
public void sendScheduledSms() {
System.out.println("나 실행");
}
}
스케쥴링 어노테이션을 활용하여고 5초마다 실행을 진행시켜보니 정상적으로 작동됨을 확인할수 있다.
그렇다면 특정 시간대로 변경을 진행해보자
@Scheduled(cron=)
@Service
public class SmsService {
@Scheduled(cron = "0 03 17 * * *") // 매일 17:03에 실행
public void sendScheduledSms() {
System.out.println("나 실행");
}
}
특정 시간에 스케줄러를 실행하려고 @Scheduled 어노테이션의 cron 속성을 활용하였고 해당 자릿수가 의미하는건 다음과 같다.
- 첫 번째 필드(0): 초 (0-59)
- 두 번째 필드(30): 분 (0-59)
- 세 번째 필드(17): 시간 (0-23)
- 네 번째 필드(*): 일 (1-31)
- 다섯 번째 필드(*): 월 (1-12 또는 JAN-DEC)
- 여섯 번째 필드(*): 요일 (0-7 또는 SUN-SAT, 0과 7은 일요일)
그런데 실제 콘솔을 확인해보니 출력이 2번이나 진행되고 있었다.
해당 원인을 찾기위해
sout이 아닌 logger로 값을 찍어보기로 하였다.
public void sendScheduledSms() {
System.out.println("나 실행");
logger.info("sendScheduledSms 메서드가 호출되었습니다.");
logger.info("sendScheduledSms 시작 시각: {}", LocalDateTime.now());
logger.info("실행 스레드: {}", Thread.currentThread().getName());
}
Sout VS Logger (같이보면 좋은 영상) : https://www.youtube.com/watch?v=1MD5xbwznlI
확인해보니 현재 2개의 스레드가 동시에 진행되는 문제가 있었다
이것을 확인해보니 현재 Bean이 2개나 실행되고 있었고 이로 인한 에러로 확인되었다.
확인해보니.. root-context와 servlet-context에 bean을 스캔하는게 2번 실행되어 그랬다..
<!-- <context:component-scan base-package="com.mini" /> -->
해결완료!
이제 새로운 공지 또는 알람이 나타났을때 메세지가 전달되도록 진행하면 된다!