카테고리 없음

@Scheduled 메서드가 특정 클래스에서 실행되지 않습니다.

기록만이살길 2021. 2. 27. 04:26
반응형

@Scheduled 메서드가 특정 클래스에서 실행되지 않습니다.

1. 질문(문제점):

다른 클래스의 스프링 부트 프로젝트에 예약 된 메서드가 몇 가지 있는데 이러한 클래스가 ClassA, ClassB 및 ClassC라고 가정하겠습니다. 이러한 모든 클래스는 동일한 패키지에 있습니다. MainApplication 클래스의 기본 메서드에 대해 @EnableScheduling이 있습니다.

이러한 모든 메소드는 application.properties 파일에서 cron 표현식을 읽습니다. @Scheduled 주석의 부적절한 가져 오기도 확인했습니다. 모든 파일에는 동일한 가져 오기가 있지만 ClassA에서 예약 된 메서드를 실행할 수없는 것이 무엇이든 상관 없습니다.

@Service
public class ClassB{
   
   @Scheduled(cron = "0 15 10 15 * ?")
   public void attendanceCalculator(){
       //this one runs fine
   }

}

또 하나는 이렇게

@Service
public class ClassB{
   
   @Scheduled(cron = "0 0 0 ? * * ")
   public void dailyAttSummaryGenerator(){
       //this one runs fine too
   }

}

하지만 이것들은 내가 무엇을하든 실행되지 않습니다.

@Service
public class ClassA{
   
   @Scheduled(cron = "0 0 0 ? * * ")
   public void testOne(){
       //this one doesn't run
   }
   
   @Scheduled(fixedRate = 1000)
   public void testTwo(){
       //this one doesn't run either
   }

}

그러나 이상하게도 이것은 작동합니다.

@Service
public class ClassB{
   @Autowired
   public ClassA classA;
     
   @Scheduled(cron = "0 0 0 ? * * ")
   public void testOne(){
       classA.testOne(); // This runs
   }

   @Scheduled(fixedRate = 1000)
   public void testTwo(){
      classA.testTwo(); // This runs too
   }


}

ClassC 내부에서 classA를 autowire하는 경우에도 작동합니다.

누군가가 왜 이런 일이 발생하는지 또는 내가 뭘 잘못하고 있는지 설명해 주시겠습니까? 어떤 도움을 주시면 감사하겠습니다.

2. 해결방안:

업데이트 :이 경우 OP에 대한 해결책은 .m2 폴더를 지우는 것입니다.


다음 ClassA을 활성화하여 내 컴퓨터에서 실행되지 않는 일정의 동작을 재현 할 수있었습니다.lazy-initialization

spring:
  main:
    lazy-initialization: true

불행히도 시작 중에 초기화되는 구성 요소 에 자동 ClassB연결될 때까지 동일한 일이 발생했습니다 ClassB.

@Lazy(false)lazy-init을 켜기 전에 ClassA에 다시 가져온 항목에 주석을 달았습니다 .

@ ThomasKåsene은 위의 주석에서 문제가 예약 된 스레드 풀의 스레드 수와 관련이있을 수 있다고 제안했습니다. 따라서 pool-size = 1로 구성을 테스트했지만이 구성으로 동작을 재현 할 수 없었습니다.

@Configuration
@EnableScheduling
public class AppConfigCron implements SchedulingConfigurer {

    @Override
    public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
        taskRegistrar.setScheduler(taskExecutor());
    }

    @Bean
    public Executor taskExecutor() {
        return Executors.newScheduledThreadPool(1);
    }
}

다른 각도를 테스트 한 후 OP의 환경과 다른 환경에서 전체 시나리오를 재현하는 것이 어려울 것이라고 생각하는 경향이 있습니다 (불가능합니까?).

65777545
반응형