[Dining-together] 게시글 마감기한 두고 마감기한 되면 자동으로 마감 ( 특정한 시간에 메소드 실행 @Scheduled )

Jifrozen·2021년 7월 30일
0

Dining-together

목록 보기
18/25

게시글 마감기한 두고 마감기한 되면 자동으로 마감 ( 특정한 시간에 메소드 실행 @Scheduled )

현재 경매 프로젝트에 경매 마감시간을 정해 마감시간이 되면 자동으로 마감처리를 해주도록 기획했다.
기획할때는 생각하지 못했는데 실시간 처리라는게 생각보다 힘들었다.
그래서 찾고 찾다가 @Scheduled 발견했다.

@scheduled

  1. @EnableScheduling 스케쥴링 작업을 한다고 알린다.
@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 [기본기를 쌓는 정아마추어 코딩블로그]

  1. @Query("select a from Auction a where a.status=:status and a.deadline < :date")
    List findAllByStatusAndDeadlineAfter(AuctionStatus status, LocalDateTime date);
  1. 10초마다 모든 리스트에서 마감 시간을 체크해 마감이라면 상태를 마감으로 처리
	@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);
	}

고민했던 부분

일단 제대로 동작은 하는데 과연 이렇게 하는게 효율적인지 과부하인지 걱정이다...ㅁ

0개의 댓글