현재 경매 프로젝트에 경매 마감시간을 정해 마감시간이 되면 자동으로 마감처리를 해주도록 기획했다.
기획할때는 생각하지 못했는데 실시간 처리라는게 생각보다 힘들었다.
그래서 찾고 찾다가 @Scheduled 발견했다.
@SpringBootApplication
@EnableScheduling
public class AuctionApplication {
cron : cron표현식을 지원한다. "초 분 시 일 월 주 (년)"으로 표현한다. cron표현식에 쓸 수 있는 것들(특수문자 활용 포함)이 많은데 해당 내용이 핵심이 아니므로 다른 블로그에서 확인해보기를 바란다.
fixedDelay : milliseconds 단위로, 이전 작업이 끝난 시점으로 부터 고정된 시간을 설정한다. ex) fixedDelay = 5000
fixedDelayString : fixedDelay와 같은데 property의 value만 문자열로 넣는 것이다. ex) fixedDelay = "5000"
fixedRate : milliseconds 단위로, 이전 작업이 수행되기 시작한 시점으로 부터 고정된 시간을 설정한다. ex) fixedRate = 3000
fixedRateString : fixedDelay와 같은데 property의 value만 문자열로 넣는 것이다. ex) fixedRate = "3000"
initialDelay : 스케줄러에서 메서드가 등록되자마자 수행하는 것이 아닌 초기 지연시간을 설정하는 것이다.
initialDelayString : 위와 마찬가지로 문자열로 값을 표현하겠다는 의미다.
zone : cron표현식을 사용했을 때 사용할 time zone으로 따로 설정하지 않으면 기본적으로 서버의 time zone이다.
출처: https://jeong-pro.tistory.com/186 [기본기를 쌓는 정아마추어 코딩블로그]
@Query("select a from Auction a where a.status=:status and a.deadline < :date")
List findAllByStatusAndDeadlineAfter(AuctionStatus status, LocalDateTime date); @Scheduled(cron = "10 * * * * *")
@Transactional
public void updateState() {
LocalDateTime endDate = LocalDateTime.now();
List<Auction> auctions = auctionRepository.findAllByStatusAndDeadlineAfter(AuctionStatus.PROCEEDING, endDate);
List<SuccessBid> successBids = successBidRepository.findAllByCompleteFalseAndReservationAfter(endDate);
auctions.forEach(auction -> {
log.info(String.valueOf(auction.getDeadline()));
auction.setStatus(AuctionStatus.END);
});
successBids.forEach(successBid -> {
log.info(String.valueOf(successBid.getReservation()));
successBid.setComplete(true);
});
log.info(String.valueOf(endDate));
auctionRepository.saveAll(auctions);
successBidRepository.saveAll(successBids);
}
일단 제대로 동작은 하는데 과연 이렇게 하는게 효율적인지 과부하인지 걱정이다...ㅁ