You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@tomcat.apache.org by Benny Kannengießer <Be...@re-lounge.com> on 2023/03/24 08:48:12 UTC

Redis Session Manager - add Fallback

Hi,

I'm using the Redis Session Manager (https://jitpack.io/p/ran-jit/TomcatClusterRedisSessionManager)
to replicate sessions in a Tomcat cluster.

When the Redis database is down, a 500 response is returned in every request.
In this case I would rather like to switch back to local session management. Like this I could at least serve jsp pages.
There's already an issue for this https://github.com/redisson/redisson/issues/1651 but nobody seems to care about it.

Does anybody have experience with the implementation of session managers?
Maybe it would be easy to just write a thin "wrapper"?

Exception stacktrace that is thrown when Redis is down:

21-Mar-2023 22:28:10.146 SEVERE [http-nio-8090-exec-10] org.apache.catalina.core.StandardHostValve.custom Exception Processing ErrorPage[errorCode=500, location=/fehlerseiten/500.jsp]
org.apache.jasper.JasperException: javax.servlet.ServletException: redis.clients.jedis.exceptions.JedisConnectionException: Could not get a resource from the pool
            at org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:638)
            at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:499)
            at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:385)
            at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:329)
            at javax.servlet.http.HttpServlet.service(HttpServlet.java:741)
            at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231)
            at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
            at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:712)
            at org.apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDispatcher.java:461)
            at org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:384)
            at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:312)
            at org.apache.catalina.core.StandardHostValve.custom(StandardHostValve.java:394)
            at org.apache.catalina.core.StandardHostValve.status(StandardHostValve.java:253)
            at org.apache.catalina.core.StandardHostValve.throwable(StandardHostValve.java:348)
            at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:173)
            at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92)
            at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:668)
            at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74)
            at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343)
            at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:417)
            at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66)
            at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:834)
            at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1415)
            at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
            at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
            at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
            at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
            at java.base/java.lang.Thread.run(Thread.java:829)
Caused by: javax.servlet.ServletException: redis.clients.jedis.exceptions.JedisConnectionException: Could not get a resource from the pool
            at org.apache.jsp.fehlerseiten._500_jsp._jspService(_500_jsp.java:1106)
            at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
            at javax.servlet.http.HttpServlet.service(HttpServlet.java:741)
            at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:476)
            ... 26 more
Caused by: redis.clients.jedis.exceptions.JedisConnectionException: Could not get a resource from the pool
            at redis.clients.util.Pool.getResource(Pool.java:53)
            at redis.clients.jedis.JedisPool.getResource(JedisPool.java:226)
            at redis.clients.jedis.JedisPool.getResource(JedisPool.java:16)
            at tomcat.request.session.data.cache.impl.redis.RedisManager.setnx(RedisManager.java:52)
            at tomcat.request.session.data.cache.impl.redis.RedisCache.setnx(RedisCache.java:33)
            at tomcat.request.session.redis.SessionManager.createSession(SessionManager.java:107)
            at tomcat.request.session.redis.SessionManager.createSession(SessionManager.java:31)
            at org.apache.catalina.connector.Request.doGetSession(Request.java:3018)
            at org.apache.catalina.connector.Request.getSession(Request.java:2416)
            at org.apache.catalina.connector.RequestFacade.getSession(RequestFacade.java:908)
            at javax.servlet.http.HttpServletRequestWrapper.getSession(HttpServletRequestWrapper.java:241)
            at org.apache.catalina.core.ApplicationHttpRequest.getSession(ApplicationHttpRequest.java:564)
            at org.apache.catalina.core.ApplicationHttpRequest.getSession(ApplicationHttpRequest.java:509)
            at org.apache.jasper.runtime.PageContextImpl.initialize(PageContextImpl.java:133)
            at org.apache.jasper.runtime.JspFactoryImpl.internalGetPageContext(JspFactoryImpl.java:109)
            at org.apache.jasper.runtime.JspFactoryImpl.getPageContext(JspFactoryImpl.java:60)
            at org.apache.jsp.fehlerseiten._500_jsp._jspService(_500_jsp.java:140)
            ... 29 more
Caused by: redis.clients.jedis.exceptions.JedisConnectionException: java.net.SocketTimeoutException: connect timed out
            at redis.clients.jedis.Connection.connect(Connection.java:207)
            at redis.clients.jedis.BinaryClient.connect(BinaryClient.java:93)
            at redis.clients.jedis.BinaryJedis.connect(BinaryJedis.java:1767)
            at redis.clients.jedis.JedisFactory.makeObject(JedisFactory.java:106)
            at org.apache.commons.pool2.impl.GenericObjectPool.create(GenericObjectPool.java:868)
            at org.apache.commons.pool2.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:435)
            at org.apache.commons.pool2.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:363)
            at redis.clients.util.Pool.getResource(Pool.java:49)
            ... 45 more
Caused by: java.net.SocketTimeoutException: connect timed out
            at java.base/java.net.PlainSocketImpl.socketConnect(Native Method)
            at java.base/java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:412)
            at java.base/java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:255)
            at java.base/java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:237)
            at java.base/java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)
            at java.base/java.net.Socket.connect(Socket.java:609)
            at redis.clients.jedis.Connection.connect(Connection.java:184)
            ... 52 more

Thanks for any help or tips!

Best regards,
Benny