@Scheduled

 

프로젝트 진행 중, 게시글의 모집 마감 시간이 될 경우 게시글의 상태를 '마감'으로 변경하는 로직을 생성해야 했다.

 

Spring Scheduler는 일정한 시간 간격 혹은 특정 시간에 로직을 반복하는 기능을 가지고 있으므로 이를 사용하고자 했다.

 

Spring Scheduler 사용법 (Link)

 

게시글 지원 마감 시간을 30분 간격으로 설정해 두었기 때문에 매 30분 마다 모집 중인 게시글을 확인하는 로직을 만들어 해결할 수 있었다.

 

// 30분 마다 만료된 글을 찾아서 상태를 변경해준다.
@Scheduled(cron = "2 0/30 * * * *")
public void scheduledExpiry() {
    List<Content> contents = contentRepository.findAllByStatus(Content.Status.RECRUITING);

    for (Content content : contents) {
        // null 아니고, 마감 시간(0초)이 현재 시간(2초)보다 이전인가?
        if (content.getDeadLine() != null && content.getDeadLine().isBefore(LocalDateTime.now())) {
            content.setStatus(Content.Status.EXPIRED);
        }
    }
}

 

 

 

같은 방법으로 게시글에 지원 요청이 승인되어 일을 한 후, 완료 시간이 되었을 경우 '작업 완료' 상태로 변경하는 로직도 생성할 수 있었다.

 

- 일의 시작 및 종료 시간도 30분 간격으로 설정할 수 있다.

 

// 30분 마다 완료된 지원과 글을 찾아서 상태를 변경해준다.
@Scheduled(cron = "1 0/30 * * * *")
public void scheduledCompletion() {
	List<ContentApply> applies = applyRepository.findAllByApplyStatus(ContentApply.ApplyStatus.MATCH);

	// 작업 시간을 가져온다.
	for (ContentApply apply : applies) {
		List<WorkTime> workTimes = apply.getContent().getWorkTimes();
		long count = -1;

		// 아직 종료 시간이 되지 않은 작업이 있는지 확인
		if (workTimes != null && workTimes.size() != 0) {
			count = workTimes.stream()
				// 완료 시간(0초)이 현재 시간(1초)보다 이후인가?
				.filter(workTime -> workTime.getEndWorkTime().isAfter(LocalDateTime.now()))
				.count();
		}

		if (count == 0) {
			apply.complete();	// COMPLETED로 상태 변경
			apply.getContent().setStatus(Content.Status.COMPLETED);
		}
	}
}

 

+ Recent posts