복붙노트

[SPRING] 석영 : 절대로 실행하지 않을 Cron 식

SPRING

석영 : 절대로 실행하지 않을 Cron 식

여기에 중복 된 부분이 있다는 것을 알고 있습니다. 아마도 더 정확한 설명이 필요할 지 모르지만, 아마도 여기에 나와있는 내용이 나와있을 것입니다.

Spring 애플리케이션 컨텍스트를 사용하여 Java 웹 애플리케이션과 작업한다. 이 컨텍스트에서 Quartz를 사용하여 예약 된 작업을 정의했습니다. 이러한 작업은 .properties 파일에 정의 된 cron에 의해 트리거됩니다.

Spring 컨텍스트는 전쟁 내에 포함되지만 .properties 파일은 애플리케이션 서버 (이 경우에는 Tomcat)에 있습니다.

이것은 잘되고 환경 (개발, 통합, 생산, ...)에 따라 다른 cron을 정의 할 수 있습니다.

이제이 응용 프로그램을 내 컴퓨터에서 로컬로 실행할 때 이러한 작업을 실행하지 않기를 바랍니다. 트리거하지 않는 cron 표현식을 작성하는 방법이 있습니까?

해결법

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

    1.Quartz 1에서는이 크론을 사용할 수 있습니다 : 59 59 23 31 12? 2099 (마지막 유효한 날짜). Quartz 2에서이 cron을 사용할 수 있습니다 : 0 0 0 1 1? 2200

    Quartz 1에서는이 크론을 사용할 수 있습니다 : 59 59 23 31 12? 2099 (마지막 유효한 날짜). Quartz 2에서이 cron을 사용할 수 있습니다 : 0 0 0 1 1? 2200

    org.quartz.CronExpression을 사용하여 몇 가지 빠른 테스트를 수행했습니다.

    String exp = "0 0 0 1 1 ? 3000";
    boolean valid = CronExpression.isValidExpression(exp);
    System.out.println(valid);
    if (valid) {
        CronExpression cronExpression = new CronExpression(exp);
        System.out.println(cronExpression.getNextValidTimeAfter(new Date()));
    }
    

    String exp = "# 0 0 0 1 1?";을 수행하면 isValid 테스트에서 false를 반환합니다.

    위에 주어진 샘플을 사용하면 출력은 다음과 같습니다.

    true
    null
    

    의미:

    스케줄러가 cron 트리거를 승인하려면, 후자는 미래의 날짜와 일치해야합니다.

    몇 년 동안 노력했는데 한 해가 2300을 넘으면 Quartz는 더 이상 귀찮은 것 같지 않습니다 (비록 Quartz 2의 문서에서 그 해의 최대 값에 대한 언급을 찾지 못했지만). 이 작업을 수행하는 더 깨끗한 방법이있을 수 있지만 이것이 현재 나의 필요를 충족시킬 것입니다.

    그래서 결국 내가 제안한 cron은 0 0 0 1 1입니까? 2200

    Quartz 1에서는 2099 년이 마지막 유효 연도이다. 따라서 Maciej Matys의 제안을 사용하기 위해 cron 표현식을 적용 할 수 있습니다 : 59 59 23 31 12? 2099

    Arnaud Denoyelle은 더 우아한 것을 제안했습니다. 위의 테스트는 올바른 표현으로 검증됩니다. 먼 미래에 날짜를 선택하는 대신 멀리 과거에 선택하십시오.

    0 0 0 1 1? 1970 (Quartz 문서에 따른 첫 번째 유효한 표현식).

    이 솔루션은 작동하지 않습니다.

    과거에 Quartz가 표현식을 탐지 할 것이라고 강조한 hippofluff는 결코 다시 실행되지 않으므로 예외가 발생합니다.

    org.quartz.SchedulerException: Based on configured schedule, the given trigger will never fire.
    

    이것은 Quartz에서 오랫동안 사용 된 것으로 보인다.

    이것은 내 테스트의 약점을 강조합니다. CronExpression을 테스트하려면 nextValidTime1이 있어야 함을 기억하십시오. 그렇지 않으면, 당신이 그것을 전달할 스케줄러는 단순히 위에서 언급 한 예외와 함께 그것을 거부합니다.

    다음과 같이 테스트 코드를 적용하는 것이 좋습니다.

    String exp = "0 0 0 1 1 ? 3000";
    boolean valid = CronExpression.isValidExpression(exp);
    if (valid) {
        CronExpression cronExpression = new CronExpression(exp);
        valid = cronExpression.getNextValidTimeAfter(new Date()) != null;
    }
    System.out.println("Can I use <" + exp + ">? " + (valid ? "Go ahead!" : "This shall fail."));
    

    거기에 가세요 : 생각할 필요가 없습니다. 출력물을 읽으십시오.

    1 이것은 내가 Arnaud의 해결책을 테스트 할 때 깜빡하고 나를 바보로 만들고 내 테스트가 나를 증명할 수 없다는 것을 증명하는 부분입니다.

  2. ==============================

    2.기술적으로 Quartz 연도 필드 (선택 사항)의 유효한 값은 1970-2099이므로 2300은 예상 값이 아닙니다. 나는 이것을 정말로 할 필요가 있다고 가정하고 Quartz 버전은 올바른 cron 문법 (1-31 일, 1-12 개월 등)을 시행하려고 시도한다.

    기술적으로 Quartz 연도 필드 (선택 사항)의 유효한 값은 1970-2099이므로 2300은 예상 값이 아닙니다. 나는 이것을 정말로 할 필요가 있다고 가정하고 Quartz 버전은 올바른 cron 문법 (1-31 일, 1-12 개월 등)을 시행하려고 시도한다.

    나는 현재 유효 실행 된 crontab 형식으로 일정 정보를 받아 들여 수동 실행 전용 테스트 작업을 생성하는 레일즈 용 Resque-scheduler에서 다음 코드를 사용하고 있습니다.

    cron: "0 5 31 2 *"
    

    그 일은 2 월 31 일 새벽까지 참을성있게 기다리고 있습니다. Quartz crontrigger에서 이에 상응하는 내용을 보려면 다음 줄 또는 그 변형을 시도하십시오.

    0 0 5 31 2 ?
    
  3. ==============================

    3.이것을 시도해보십시오 : 59 59 23 31 12? 2099

    이것을 시도해보십시오 : 59 59 23 31 12? 2099

  4. ==============================

    4.비슷한 문제를 해결하려고 시도하는 동안 cron 표현식을 사용하지 못하게했지만 유효한 미래 일정 날짜가 필요하다는 동일한 문제가 발생했습니다.

    비슷한 문제를 해결하려고 시도하는 동안 cron 표현식을 사용하지 못하게했지만 유효한 미래 일정 날짜가 필요하다는 동일한 문제가 발생했습니다.

    또한 7 값 구문을 사용하여 문제가 발생했습니다. cron 일정에서 1 년을 지정할 수 없습니다.

    그래서 저는 이것을 사용했습니다 : 0 0 3? 2 월 5 일

    다음에 실행될 시간은 다음과 같습니다.

    따라서 본질적으로 모든 의도와 목적에 따라 장애가 있습니다. :)

    아. 저주, 이것은 쿼츠 스케줄러 구문에서만 작동합니다 - Spring CronTrigger 구문은 5 번째 월요일에 MON # 5를 허용하지 않습니다.

    다음으로 가장 좋은 것은 0 0 3 29 2입니까? 2 월 29 일 오전 3시 (윤년)에만 실행됩니다.

  5. ==============================

    5.컴퓨터에서 일정을 사용하지 않도록 설정하려면 여러 가지 방법이 있습니다.

    컴퓨터에서 일정을 사용하지 않도록 설정하려면 여러 가지 방법이 있습니다.

    먼저 Quartz의 설정을 @ Profile-based 설정으로 옮기고이 프로파일을 로컬로 활성화 할 수 없다. 프로필이 활성화되어 있지 않으면 Quartz가 시작되지 않습니다.

    대안은 Quartz가 자동으로 시작되지 않도록 설정하는 것입니다. 개발자 프로필에 등록 된 BeanPostProcessor에서 설정할 수있는 SchedulerFactoryBean # setAutoStartup ()이 있습니다. 이 쓰레드는 상당히 오래되었지만, Spring Boot는 SchedulerFactoryBeanCustomizer 빈을 등록하여 같은 일을 할 수있는 대안을 제공한다.

  6. from https://stackoverflow.com/questions/13835221/quartz-cron-expression-that-will-never-execute by cc-by-sa and MIT license