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" />	 -->

해결완료!

 

이제 새로운 공지 또는 알람이 나타났을때 메세지가 전달되도록 진행하면 된다!