Total: Today: Yesterday:
개발/JAVA | 2019. 6. 2. 19:00 | Posted by 자수씨

개요

spring-session 에 저장방식을 redis 로 지정하고 redis 라이브러리를 lettuce 로 지정하였다.

개발서버에서는 정상적으로 동작하였으나 운영서버에서는 같은 AWS EC2 인스턴스임에도 아래와 같은 오류가 발생하였다.

java.lang.ClassCastException: io.netty.channel.epoll.EpollEventLoopGroup cannot be cast to io.netty.channel.EventLoopGroup
    at io.lettuce.core.resource.DefaultEventLoopGroupProvider.getOrCreate(DefaultEventLoopGroupProvider.java:119) ~[lettuce-core-5.1.6.RELEASE.jar:na]

작업1

lettuce Native-Stransports 를 보면 native netty 의 성능이 더 좋으므로 netty-transport-native-epoll 을 디펜던시에 추가하라고 명시되어 있다.

디펜던시를 추가하고 웹 어플리케이션을 재시작하면 위와 같은 오류는 발생하지 않는다. 하지만 로컬 환경에서 native 디펜던시를 추가하는 것은 또다른 문제가 발생할 것으로 보여 다른 방법을 찾아야 했다.

작업2

lettuce Native-Stransports 를 자세히 살펴보니 native netty 를 사용하지 않는 옵션을 발견하였다.

catalina.sh 에 다음과 같이 시스템 프로퍼티를 추가한다.

# netty native settings
JAVA_OPTS="$JAVA_OPTS -Dio.lettuce.core.epoll=false"

재시작 시 native netty 를 사용하지 않고 정상동작 하는 것을 확인하였다.

INFO 15189 --- [enerContainer-1] io.lettuce.core.EpollProvider            : Starting without optional epoll library
INFO 15189 --- [enerContainer-1] io.lettuce.core.KqueueProvider           : Starting without optional kqueue library

작업3

EPollProvider 를 보다보니 io.netty.channel.epoll.Epoll 클래스가 있는지를 체크하는데 저 클래스로 인해 native netty 가 활성화 된 것으로 추가한 기억이 없는 클래스의 위치를 찾기 위해 classloader.jsp 를 인터넷에서 구하여 위치를 확인해보았다.

예전에 tomcat session 을 redis 로 설정하기 위해 ${catalina_base}/lib 에 추가하였던 redis-session-manager-with-dependencies-2.2.2-SNAPSHOT.jar 이 파일이 문제였다. 이번 작업으로 인해 제거해도 무방했던 jar 파일이라 제거하고 테스트를 해보았더니 정상이였다.

결론

문제의 원인은 이전에 추가하였던 redis-session-manager 라이브러리와의 충돌이였다. 어쩐지 인터넷을 찾아봐도 비슷한 내용이 나오지 않더라니...

돌고 돌았지만 문제의 원인은 확인하고 해결할 수 있었다.