Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -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<GroupOrderDAO> 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();
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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) ||
Expand All @@ -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(
Expand Down Expand Up @@ -160,6 +163,7 @@ public void handleSessionExpiry(String sessionId) {

// 세션 삭제
groupOrderRepositoryJPA.delete(session);
groupOrderRepositoryJPA.flush(); // 즉시 변경사항 반영
}

// 관련 태스크 정리
Expand Down