>source

My Spring Boot App에서는 매분마다 실행되는 예약 된 작업이 있습니다. 그것은 일부 쿼리를 실행하여 만기가되는 알림을 찾은 다음 이메일로 보냅니다.

@Service
public class EmailSender {
    @Scheduled(cron= "0 * * * * *")
    public void runTask() {
      //send some emails
    }
}

로컬에서 테스트 할 때 잘 작동하지만 Azure에 배포 할 때 각 이메일의 2 부가 전송됩니다. 이것은 우리가 실행하는 Azure에서 (적어도) 2 개의 컨테이너가 모두 스케줄링을 사용할 수 있기 때문입니다.

Container 환경 변수를 찾아 스케줄러가 확인 하고이 변수가 "true"로 설정된 경우에만 작업을 실행하지만이를 달성 할 수있는 신뢰할 수있는 방법을 찾을 수 없습니다.

이제 다음을 고려해 보았습니다

  • @scheduled 주석 제거
  • 태스크의 기능을 노출하는 HTTP 엔드 포인트 (컨트롤러 메소드) 추가
  • 이 엔드 포인트를 사용하여 매분마다라고 불리우십시오 (나는 또한 WebJobs그러나 이것은 Linux에서 앱 서비스에서 아직 지원되지 않습니다.

이것은 많은 복잡성이 많은 것처럼 보입니다. 단순한 해결책이 있는지 궁금해합니다.

여분의 복잡성을 추가하는 대신 이메일을 보내도록 예약 된 작업 중 하나만 사용하는 일반 변수를 사용하는 것이 좋습니다.

Σωτήρης Ραφαήλ2021-07-21 11:07:18

@ σωτήρηςραφαίλ는 Autoscaling에 의해 컨테이너가 자동으로 추가 /제거 될 수 있음을 감안할 때 항상 필요한 변수 가치가있는 하나의 컨테이너가 항상 있는지 확인하는 것은 분명한 방법이 없습니다.

Antonio Dragos2021-07-21 11:36:09
  • 이전 javascript : 플랫리스트에서 항목을 삭제하면 Redux를 사용하여 작동하지 않습니다
  • 다음 1.10의 값으로 숫자를 JavaScript의 무손실 부동 소수점 값으로 변환하는 방법