diff --git a/src/main/java/com/DevTino/festino_main/group_order/bean/SessionClean.java b/src/main/java/com/DevTino/festino_main/group_order/bean/SessionClean.java new file mode 100644 index 0000000..817dea5 --- /dev/null +++ b/src/main/java/com/DevTino/festino_main/group_order/bean/SessionClean.java @@ -0,0 +1,77 @@ +package com.DevTino.festino_main.group_order.bean; + +import com.DevTino.festino_main.group_order.domain.DTO.OrderMessageDTO; +import com.DevTino.festino_main.group_order.domain.DTO.TimeInfo; +import com.DevTino.festino_main.group_order.domain.ENUM.TopicMessageType; +import com.DevTino.festino_main.group_order.domain.GroupOrderDAO; +import com.DevTino.festino_main.group_order.repository.GroupOrderRepositoryJPA; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.messaging.simp.SimpMessagingTemplate; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +import java.time.LocalDateTime; +import java.util.List; + +@Component +public class SessionClean { + + private final GroupOrderRepositoryJPA groupOrderRepositoryJPA; + private final SimpMessagingTemplate messagingTemplate; + + @Autowired + public SessionClean(GroupOrderRepositoryJPA groupOrderRepositoryJPA, SimpMessagingTemplate messagingTemplate) { + this.groupOrderRepositoryJPA = groupOrderRepositoryJPA; + this.messagingTemplate = messagingTemplate; + } + + // 5분마다 실행 + @Scheduled(fixedRate = 300000) + @Transactional + public void cleanupExpiredSessions() { + // 현재시간 + LocalDateTime now = LocalDateTime.now(); + + // 전체 세션 조회 + List allSessions = groupOrderRepositoryJPA.findAll(); + + // 각 세션마다 + for (GroupOrderDAO session : allSessions) { + // 만료 시간이 이미 지났으면 + if (session.getExpiryTime() != null && session.getExpiryTime().isBefore(now)) { + + // 세션 종료 메시지 전송 + sendSessionEndMessage(session); + + // 세션 삭제 + groupOrderRepositoryJPA.delete(session); + } + } + // 즉시 DB에 반영되도록 + groupOrderRepositoryJPA.flush(); + } + + // 세션 종료 메시지 전송 + private void sendSessionEndMessage(GroupOrderDAO session) { + try { + + TimeInfo timeInfo = TimeInfo.builder() + .remainingMinutes(0) + .build(); + + OrderMessageDTO message = OrderMessageDTO.builder() + .type(TopicMessageType.SESSIONEND.name()) + .boothId(session.getBoothId()) + .tableNum(session.getTableNum()) + .payload(timeInfo) + .build(); + + String destination = "/topic/" + session.getBoothId() + "/" + session.getTableNum(); + messagingTemplate.convertAndSend(destination, message); + + } catch (Exception e) { + e.printStackTrace(); + } + } +} diff --git a/src/main/java/com/DevTino/festino_main/group_order/bean/SessionTimeOutManage.java b/src/main/java/com/DevTino/festino_main/group_order/bean/SessionTimeOutManage.java index e7efec8..400e00f 100644 --- a/src/main/java/com/DevTino/festino_main/group_order/bean/SessionTimeOutManage.java +++ b/src/main/java/com/DevTino/festino_main/group_order/bean/SessionTimeOutManage.java @@ -49,9 +49,6 @@ public void scheduleSessionTimeout(UUID boothId, Integer tableNum) { try { String sessionId = boothId + ":" + tableNum; -// // 기존 예약 태스크가 있으면 취소 -// cancelExistingTasks(sessionId); - // 기존 태스크가 있는지 확인 boolean hasExistingTasks = warningTasks.containsKey(sessionId) || endTasks.containsKey(sessionId) || @@ -71,6 +68,12 @@ public void scheduleSessionTimeout(UUID boothId, Integer tableNum) { GroupOrderDAO session = groupOrderRepositoryJPA.findById(sessionId) .orElseThrow(() -> new RuntimeException("Order session not found: " + sessionId)); + // 기존 세션이 이미 만료된 경우 + if (session.getExpiryTime() != null && session.getExpiryTime().isBefore(now)) { + handleSessionExpiry(sessionId); + return; + } + // 경고 메시지 태스크 예약 Instant warningInstant = warningTime.atZone(ZoneId.systemDefault()).toInstant(); ScheduledFuture warningTask = taskScheduler.schedule( @@ -160,6 +163,7 @@ public void handleSessionExpiry(String sessionId) { // 세션 삭제 groupOrderRepositoryJPA.delete(session); + groupOrderRepositoryJPA.flush(); // 즉시 변경사항 반영 } // 관련 태스크 정리