> Java > java지도 시간 > Spring Boot에서 여러 타이머 충돌을 해결하는 방법

Spring Boot에서 여러 타이머 충돌을 해결하는 방법

王林
풀어 주다: 2023-05-17 08:07:05
앞으로
1755명이 탐색했습니다.

사용 시나리오

저희 주문 서비스에는 일반적으로 결제 주문이 있으며 이 결제 주문은 시간 제한이 있습니다. 예를 들어 Alibaba의 주문은 5일, Taobao의 주문은 1일, Pinduoduo의 주문은 1일, 메이 그룹입니다. 주문은 15분...

펀드 시스템에서 여러 저장 파티션의 펀드 정보를 동시에 업데이트하는 방법...

일반적으로 실제 개발에서는 타이머가 여러 타이머가 실행되는 문제를 해결해야 합니다. 그리고 타이머 간의 충돌 문제를 해결하려면

큰 문제는 아닙니다. 동시성에 관해서는 멀티스레딩이 필수입니다... 한번 보시면 이해하실 겁니다

문제 시나리오가 재현되어 있습니다.

Spring Boot에서 여러 타이머 충돌을 해결하는 방법

Spring Boot에서 여러 타이머 충돌을 해결하는 방법

우리는 실행 결과가 모두 예정된 것이 분명합니다 -1

Springboot 타이머는 기본적으로 단일 스레드라고 결론 내릴 수 있습니다

그러나 스레드가 리소스를 두고 경쟁한 후에 문제가 발생합니다. , 특정 스레드를 실행하는 데 시간이 오래 걸립니다. 완료되었습니다. 다른 타이머는 대기 상태로만 들어갈 수 있습니다. 시간이 길어질수록 총 대기 시간이 늘어나 눈사태가 쉽게 발생할 수 있습니다. 실제로 구성 클래스를 추가하고 주석만 추가하면 문제를 해결할 수 있습니다. 다음과 같습니다:

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.scheduling.annotation.Async;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import java.text.SimpleDateFormat;
import java.util.Date;
@Component
public class SchedulerTaskController {
    private Logger logger= LoggerFactory.getLogger(SchedulerTaskController.class);
    private static final SimpleDateFormat dateFormat=new SimpleDateFormat("HH:mm:ss");
    private int count=0;
    @Scheduled(cron="*/6 * * * * ?")
    @Async("threadPoolTaskExecutor")
    public void process(){
        logger.info("英文:this is scheduler task runing "+(count++));
    }
    @Scheduled(fixedRate = 6000)
    @Async("threadPoolTaskExecutor")
    public void currentTime(){
        logger.info("中文:现在时间"+dateFormat.format(new Date()));
    }
}
로그인 후 복사

그러면 명확하게 볼 수 있습니다:

위 내용은 Spring Boot에서 여러 타이머 충돌을 해결하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:yisu.com
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿