복붙노트

[SPRING] 봄 스케줄러가 예기치 않게 멈 춥니 다.

SPRING

봄 스케줄러가 예기치 않게 멈 춥니 다.

Tomcat 6에는 @Scheduled를 통해 여러 예약 서비스를 사용하는 Spring 3 웹 응용 프로그램이 있습니다 (주로 밤마다 실행되는 작업에 사용). 이제 때때로 (2 개월 정도에 한 번) 스케쥴러 스레드가 작동을 멈추는 경우는 드물기 때문에 다음날 밤에는 아무 작업도 실행되지 않습니다. 로그 파일에는 예외 또는 로깅 항목이 없습니다.

아무도 이것이 왜 일어나고 있는지 실마리가 있습니까? 또는이 문제에 대한 추가 정보를 얻는 방법?

응용 프로그램 내에서 이러한 상황을 감지하고 스케줄러를 다시 시작하는 방법이 있습니까?

현재 우리는 5 분마다 실행되는 로깅 작업을 수행하고 로그 항목을 작성하여이를 해결합니다. 로그 파일의 업데이트가 중단되면 (nagios가 모니터링 함) tomcat을 다시 시작해야합니다. 서버를 완전히 다시 시작하지 않고 작업을 다시 시작하는 것이 좋습니다.

해결법

  1. ==============================

    1.이 질문에는 투표 수가 너무 많기 때문에 문제에 대한 (아마도 매우 구체적인) 해결책이 무엇인지 게시 할 것입니다.

    이 질문에는 투표 수가 너무 많기 때문에 문제에 대한 (아마도 매우 구체적인) 해결책이 무엇인지 게시 할 것입니다.

    Apache HttpClient 라이브러리를 사용하여 예약 된 작업에서 원격 서비스를 호출합니다. 불행히도 요청을 수행 할 때 설정된 기본 시간 제한은 없습니다. 설정 후

    connectTimeout
    connectionRequestTimeout
    socketTimeout
    

    30 초 동안 문제가 없어졌습니다.

    int timeout = 30 * 1000; // 30 seconds
    RequestConfig requestConfig = RequestConfig.custom()
            .setConnectTimeout(timeout)
            .setConnectionRequestTimeout(timeout)
            .setSocketTimeout(timeout).build();
    HttpClient client = HttpClients.custom()
            .setDefaultRequestConfig(requestConfig).build();
    
  2. ==============================

    2.이것은 알아 내기가 쉽습니다. 스택 트레이스를 사용하면됩니다. 스택 트레이스를 얻는 방법에 대한 많은 글이 있습니다. 유닉스 시스템에서는 'kill -3'을하고 스택 트레이스는 catalina.out 로그 파일에 나타납니다.

    이것은 알아 내기가 쉽습니다. 스택 트레이스를 사용하면됩니다. 스택 트레이스를 얻는 방법에 대한 많은 글이 있습니다. 유닉스 시스템에서는 'kill -3'을하고 스택 트레이스는 catalina.out 로그 파일에 나타납니다.

    스택 트레이스를 얻었 으면 스케줄러 스레드를 찾아서 무엇을하는지보십시오. 실행중인 작업이 멈췄을 가능성이 있습니까?

    자세한 도움말을 보려면 여기에 스택 추적을 게시하십시오.

    알아야 할 중요한 것은 당신이 사용하는 스케줄러입니다. SimpleAsyncTaskExecutor를 사용하면 각 작업에 대한 새 스레드가 시작되고 일정이 결코 실패하지 않습니다. 그러나 완료되지 않은 작업이 있으면 결국 메모리가 부족합니다.

    http://docs.spring.io/spring/docs/3.0.x/reference/scheduling.html

  3. from https://stackoverflow.com/questions/17909404/spring-scheduler-stops-unexpectedly by cc-by-sa and MIT license