복붙노트

[SPRING] Spring Quartz 작업 실행이 겹치지 않도록한다.

SPRING

Spring Quartz 작업 실행이 겹치지 않도록한다.

Spring Qquartz에서 매 20 초마다 실행되는 Java 프로그램이 있습니다. 때로는 실행하는 데 몇 초 밖에 걸리지 않지만 데이터가 커지면 20 초 이상 실행될 것입니다.

한 인스턴스가 아직 실행 중일 때 Quartz가 작업을 시작하거나 트리거하지 못하게하려면 어떻게해야합니까? 데이터베이스에서 동일한 작업을 수행하는 2 개의 작업을 실행하는 것은 그리 좋지 않을 것입니다. 내가 일종의 동기화를 할 수있는 방법이 있습니까?

해결법

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

    1.20 초마다 발사하면됩니다. 석영은 심각한 과잉입니다. java.util.concurrent.ScheduledExecutorService는 해당 작업에 완벽하게 충분해야합니다.

    20 초마다 발사하면됩니다. 석영은 심각한 과잉입니다. java.util.concurrent.ScheduledExecutorService는 해당 작업에 완벽하게 충분해야합니다.

    ScheduledExecutorService는 또한 스케줄링을위한 두 가지 의미를 제공합니다. "고정 속도"는 겹침에 관계없이 20 초마다 작업을 실행하려고 시도하지만 "고정 지연"은 첫 번째 작업의 끝과 다음 작업의 시작 사이에 20 초를 남기려고 시도합니다. 중복을 피하려면 고정 지연이 가장 안전합니다.

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

    2.Job 대신에 StatefulJob을 구현하도록 클래스를 변경하면, Quartz가 이것을 처리 할 것입니다. StatefulJob javadoc에서 :

    Job 대신에 StatefulJob을 구현하도록 클래스를 변경하면, Quartz가 이것을 처리 할 것입니다. StatefulJob javadoc에서 :

    StatefulJob은 Job을 확장하고 새로운 메소드를 추가하지 않으므로 원하는 동작을 얻으려면 다음을 변경해야합니다.

    public class YourJob implements org.quartz.Job {
        void execute(JobExecutionContext context) {/*implementation omitted*/}
    }
    

    이에:

    public class YourJob implements org.quartz.StatefulJob {
        void execute(JobExecutionContext context) {/*implementation omitted*/}
    }
    

    Quartz 버전 2.0에서 StatefulJob은 더 이상 사용되지 않습니다. 이제는 특수 효과 대신에 특수 효과를 사용하는 것이 좋습니다.

    @DisallowConcurrentExecution
    public class YourJob implements org.quartz.Job {
        void execute(JobExecutionContext context) {/*implementation omitted*/}
    }
    
  3. ==============================

    3.누군가이 질문을 참조 할 경우를 대비해 StatefulJob은 더 이상 사용되지 않습니다. 이제는 주석을 사용하는 것이 좋습니다 ...

    누군가이 질문을 참조 할 경우를 대비해 StatefulJob은 더 이상 사용되지 않습니다. 이제는 주석을 사용하는 것이 좋습니다 ...

    @PersistJobDataAfterExecution
    @DisallowConcurrentExecution
    public class TestJob implements Job {
    

    이 주석이 무엇을 의미하는지 설명 할 것입니다 ...

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

    4.당신이 봄 석영을 사용한다면, 나는 당신이 이렇게 구성해야한다고 생각합니다.

    당신이 봄 석영을 사용한다면, 나는 당신이 이렇게 구성해야한다고 생각합니다.

        <bean id="batchConsumerJob"class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
            <property name="targetObject" ref="myScheduler" />
            <property name="targetMethod" value="execute" />
            <property name="concurrent" value="false" />
        </bean>
    
  5. ==============================

    5.두 번째 작업은 첫 번째 작업이 완료 될 때까지 차단되므로 작업이 완료 될 확률이 높습니다. 작업을 대기열에 넣을 수 있지만 설명에서 대기열이 무한정 커질 수있는 것처럼 들립니다.

    두 번째 작업은 첫 번째 작업이 완료 될 때까지 차단되므로 작업이 완료 될 확률이 높습니다. 작업을 대기열에 넣을 수 있지만 설명에서 대기열이 무한정 커질 수있는 것처럼 들립니다.

    ReadWriteLocks를 조사하고 작업이 실행되는 동안 잠금을 설정하도록합니다. 이후 작업은이 잠금을 검사하고 이전 작업이 아직 실행중인 경우 즉시 종료 할 수 있습니다. 나는 이것이 경험에 접근하는 가장 신뢰할만한 방법이라는 것을 발견했다.

    아마도 경고를 생성하여 문제가 발생하고 이에 따라 시간 간격을 늘릴 수 있다는 것을 알고 있습니까?

  6. ==============================

    6.그들을 대기열에 넣어 라.

    그들을 대기열에 넣어 라.

    시간이 20 초를 초과하더라도 현재 작업은 완료되어야하며 다음 작업은 대기열에서 가져와야합니다.

    또는 합리적인 금액으로 시간을 늘릴 수도 있습니다.

  7. ==============================

    7.세마포어를 사용할 수 있습니다. 세마포어를 가져 가면 두 번째 작업을 포기하고 다음 화재 시간까지 기다립니다.

    세마포어를 사용할 수 있습니다. 세마포어를 가져 가면 두 번째 작업을 포기하고 다음 화재 시간까지 기다립니다.

  8. from https://stackoverflow.com/questions/1636556/ensure-that-spring-quartz-job-execution-doesnt-overlap by cc-by-sa and MIT license