728x90
SpringBoot로 webSocket을 구현했는데, 1분단위로 세션이 끊기는 문제가 발생했다.
일단 클라이언트 단에서 세션이 끊길경우 재 연결하는 코드를 넣어 두긴했는데,,
당연히 세션이 안끊기는게 맞는 거 아닌가 싶어서 다음과 같이 땜질을 해두었다.
문제는 aws EC2는 1분간 클라이언트와 서버간의 데이터 송수신이 없으면 연결을 끊어 버린다는데 있었다.
그래서 30초에 한번씩 서로 핑퐁을 주고 받는 것으로 땜질
서버
@Scheduled(fixedDelay = 30000)
public void ping() throws Exception {
HashMap<String, Object> dto = new HashMap<>();
dto.put("code", "ping");
for (WebSocketSession wss : webSocketSessionSet) {
wss.sendMessage(new TextMessage(mapper.writeValueAsString(dto)));
}
}
이 메서드를 소켓핸들러 클래스에 넣었다.
주의 할 것은 스프링 어플리케이션을 런 하는 클래스에서도 어노테이션을 다음과 같이 추가해야 된다.
@EnableScheduling
@SpringBootApplication
public class MinesweeperApplication {
public static void main(String[] args) {
SpringApplication.run(MinesweeperApplication.class, args);
}
}
위와 같이 @EnableScheduling을 추가 해줘야 한다.
fixedDelay 30000은 30초에 한번씩 실행한다는 뜻
클라이언트
conn.onmessage = async (msg) => {
var dto = JSON.parse(msg.data);
console.log(dto);
var code = dto.code;
var value = dto.value;
if (code == "ping") {
console.log("핑을 받았어요, 퐁을 보낼게요");
socket_send({event: "pong", data: {id: myPlayer.session_id}});
}
}
이렇게 연결 받은것을 다시 보내면 30초에 한번씩 클라이언트와 서버가 통신하게 되어 연결이 끊기지 않는다.
30초짜리 메서드를 3번 실행해도 연결이 끊기 않는 모습이다.
728x90