반응형
스프링 프로젝트에서 Netty 프레임워크를 사용하여 'ServerBootstrap'을 구동하고 사용하였는데, 톰캣을 종료하면 자연스럽게 죽을줄 알았던 Netty 서버가 좀비처럼 계속 살아있는 현상이 발생했다.
덕분에 톰캣을 재기동하게 되면 같은 포트로 바인딩하면서 BindException이 발생하는 등 여러가지 문제가 생겼고, 대처법으로 netstat을 통해 port의 pid를 찾아와 kill을 시킬까 했지만, 애초에 종료를 안하는 원초적인 문제를 해결하는것이 맞다고 판단하여 아래와 같이 '@PreDestroy' 어노테이션을 추가하여, 스프링을 종료하게되면 ServerBootstrp을 종료 할 수 있도록 구성하였다.
Netty Server 안전하게 종료하기
Controller.java
private NettyServer server;
@PostConstruct
private void start() {
new Thread(new Runnable() {
@Override
public void run() {
try {
server = new NettyServer(SERVER_PORT, service);
server.run();
} catch (Exception e) {
e.printStackTrace();
}
}
}).start();
}
/**
* 바인딩된 NettyServer를 종료한다.
* @throws InterruptedException
*/
@PreDestroy
private void destory() throws InterruptedException {
logger.info("================ Spring @PreDestroy ================");
server.serverDestroy();
}
NettyServer.java
private EventLoopGroup bossGroup;
private EventLoopGroup workerGroup;
private ChannelFuture future;
public void serverDestroy() throws InterruptedException {
logger.info("================ Netty BootStrapServer Destroy() ================");
bossGroup.shutdownGracefully().sync();
workerGroup.shutdownGracefully().sync();
future.channel().closeFuture().sync();
}
구동하면서 동작시킨 이벤트 그룹들을 shutdown시켜서 종료되도록 처리하였다.
반응형
'WEB > Spring' 카테고리의 다른 글
Spring - Spring Legacy에서 Netty Server 구동하기(ServerBootstrap) Bean등록 (2) | 2020.12.11 |
---|---|
Spring - 자바소스에서 프로퍼티(properties) 파일 읽기 (0) | 2020.12.10 |
Spring - 스프링 프로젝트에서 netty사용하기 (7) | 2020.09.22 |
Spring - Apache Tika를 활용하여 파일 위변조 체크하기 (2) | 2020.05.19 |
Spring - multipart전송인 경우 AOP에서 파라미터 가져오기 (0) | 2020.04.27 |