[SPRING] Spring Quartz 작업 실행이 겹치지 않도록한다.
SPRINGSpring Quartz 작업 실행이 겹치지 않도록한다.
Spring Qquartz에서 매 20 초마다 실행되는 Java 프로그램이 있습니다. 때로는 실행하는 데 몇 초 밖에 걸리지 않지만 데이터가 커지면 20 초 이상 실행될 것입니다.
한 인스턴스가 아직 실행 중일 때 Quartz가 작업을 시작하거나 트리거하지 못하게하려면 어떻게해야합니까? 데이터베이스에서 동일한 작업을 수행하는 2 개의 작업을 실행하는 것은 그리 좋지 않을 것입니다. 내가 일종의 동기화를 할 수있는 방법이 있습니까?
해결법
-
==============================
1.20 초마다 발사하면됩니다. 석영은 심각한 과잉입니다. java.util.concurrent.ScheduledExecutorService는 해당 작업에 완벽하게 충분해야합니다.
20 초마다 발사하면됩니다. 석영은 심각한 과잉입니다. java.util.concurrent.ScheduledExecutorService는 해당 작업에 완벽하게 충분해야합니다.
ScheduledExecutorService는 또한 스케줄링을위한 두 가지 의미를 제공합니다. "고정 속도"는 겹침에 관계없이 20 초마다 작업을 실행하려고 시도하지만 "고정 지연"은 첫 번째 작업의 끝과 다음 작업의 시작 사이에 20 초를 남기려고 시도합니다. 중복을 피하려면 고정 지연이 가장 안전합니다.
-
==============================
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.누군가이 질문을 참조 할 경우를 대비해 StatefulJob은 더 이상 사용되지 않습니다. 이제는 주석을 사용하는 것이 좋습니다 ...
누군가이 질문을 참조 할 경우를 대비해 StatefulJob은 더 이상 사용되지 않습니다. 이제는 주석을 사용하는 것이 좋습니다 ...
@PersistJobDataAfterExecution @DisallowConcurrentExecution public class TestJob implements Job {
이 주석이 무엇을 의미하는지 설명 할 것입니다 ...
-
==============================
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.두 번째 작업은 첫 번째 작업이 완료 될 때까지 차단되므로 작업이 완료 될 확률이 높습니다. 작업을 대기열에 넣을 수 있지만 설명에서 대기열이 무한정 커질 수있는 것처럼 들립니다.
두 번째 작업은 첫 번째 작업이 완료 될 때까지 차단되므로 작업이 완료 될 확률이 높습니다. 작업을 대기열에 넣을 수 있지만 설명에서 대기열이 무한정 커질 수있는 것처럼 들립니다.
ReadWriteLocks를 조사하고 작업이 실행되는 동안 잠금을 설정하도록합니다. 이후 작업은이 잠금을 검사하고 이전 작업이 아직 실행중인 경우 즉시 종료 할 수 있습니다. 나는 이것이 경험에 접근하는 가장 신뢰할만한 방법이라는 것을 발견했다.
아마도 경고를 생성하여 문제가 발생하고 이에 따라 시간 간격을 늘릴 수 있다는 것을 알고 있습니까?
-
==============================
6.그들을 대기열에 넣어 라.
그들을 대기열에 넣어 라.
시간이 20 초를 초과하더라도 현재 작업은 완료되어야하며 다음 작업은 대기열에서 가져와야합니다.
또는 합리적인 금액으로 시간을 늘릴 수도 있습니다.
-
==============================
7.세마포어를 사용할 수 있습니다. 세마포어를 가져 가면 두 번째 작업을 포기하고 다음 화재 시간까지 기다립니다.
세마포어를 사용할 수 있습니다. 세마포어를 가져 가면 두 번째 작업을 포기하고 다음 화재 시간까지 기다립니다.
from https://stackoverflow.com/questions/1636556/ensure-that-spring-quartz-job-execution-doesnt-overlap by cc-by-sa and MIT license
'SPRING' 카테고리의 다른 글
[SPRING] Jackson JSON을 사용하여 Spring MVC에서 JSON 구문 분석하기 (0) | 2018.12.11 |
---|---|
[SPRING] @Cacheable에 TTL을 설정할 수 있습니까? (0) | 2018.12.11 |
[SPRING] @Transactional 읽기 전용 전파 스프링 (0) | 2018.12.11 |
[SPRING] @RequestBody와 @RequestParam의 차이점은 무엇입니까? (0) | 2018.12.11 |
[SPRING] Spring @ContextConfiguration XML에 올바른 위치를 두는 법 (0) | 2018.12.11 |