memcached-session-manager icon indicating copy to clipboard operation
memcached-session-manager copied to clipboard

tomcat 9 redis implementation throws ClassCastException on startup

Open emmaLP opened this issue 6 years ago • 5 comments

Running application with docker in tomcat 9, JRE8 and implemented redis session manager.

The tomcat lib folder contains the following jars:

  • jedis-2.9.0.jar
  • memcached-session-manager-tc9-2.3.0.jar
  • memcached-session-manager-2.3.0.jar

context.xml file contains the following config: <Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager" memcachedNodes="redis://${tomcat.session.cache}:6379" sticky="false" requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$" /> Versions: Tomcat 9.0.17.0 JVM: 1.8.0_212-8u212-b01-1~deb9u1-b01

When starting the docker image, the following error occurs during start up:

14-May-2019 10:09:09.059 SEVERE [main] org.apache.catalina.core.StandardContext.startInternal The session manager failed to start
 org.apache.catalina.LifecycleException: Failed to start component [MemcachedBackupSessionManager[StandardEngine[Catalina].StandardHost[localhost].StandardContext[/hello]]]
        at org.apache.catalina.util.LifecycleBase.handleSubClassException(LifecycleBase.java:441)
        at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:198)
        at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5167)
        at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183)
        at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:713)
        at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:690)
        at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:695)
        at org.apache.catalina.startup.HostConfig.deployWAR(HostConfig.java:978)
        at org.apache.catalina.startup.HostConfig$DeployWar.run(HostConfig.java:1850)
        at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
        at java.util.concurrent.FutureTask.run(FutureTask.java:266)
        at org.apache.tomcat.util.threads.InlineExecutorService.execute(InlineExecutorService.java:75)
        at java.util.concurrent.AbstractExecutorService.submit(AbstractExecutorService.java:112)
        at org.apache.catalina.startup.HostConfig.deployWARs(HostConfig.java:773)
        at org.apache.catalina.startup.HostConfig.deployApps(HostConfig.java:427)
        at org.apache.catalina.startup.HostConfig.start(HostConfig.java:1577)
        at org.apache.catalina.startup.HostConfig.lifecycleEvent(HostConfig.java:309)
        at org.apache.catalina.util.LifecycleBase.fireLifecycleEvent(LifecycleBase.java:123)
        at org.apache.catalina.util.LifecycleBase.setStateInternal(LifecycleBase.java:424)
        at org.apache.catalina.util.LifecycleBase.setState(LifecycleBase.java:367)
        at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:929)
        at org.apache.catalina.core.StandardHost.startInternal(StandardHost.java:831)
        at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183)
        at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1377)
        at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1367)
        at java.util.concurrent.FutureTask.run(FutureTask.java:266)
        at org.apache.tomcat.util.threads.InlineExecutorService.execute(InlineExecutorService.java:75)
        at java.util.concurrent.AbstractExecutorService.submit(AbstractExecutorService.java:134)
        at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:902)
        at org.apache.catalina.core.StandardEngine.startInternal(StandardEngine.java:262)
        at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183)
        at org.apache.catalina.core.StandardService.startInternal(StandardService.java:423)
        at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183)
        at org.apache.catalina.core.StandardServer.startInternal(StandardServer.java:928)
        at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183)
        at org.apache.catalina.startup.Catalina.start(Catalina.java:634)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:498)
        at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:350)
        at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:492)
Caused by: java.lang.RuntimeException: Could not create transcoder factory.
        at de.javakaffee.web.msm.MemcachedSessionService.getTranscoderFactory(MemcachedSessionService.java:507)
        at de.javakaffee.web.msm.MemcachedSessionService.createTranscoderService(MemcachedSessionService.java:499)
        at de.javakaffee.web.msm.MemcachedSessionService.startInternal(MemcachedSessionService.java:453)
        at de.javakaffee.web.msm.MemcachedBackupSessionManager.startInternal(MemcachedBackupSessionManager.java:540)
        at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183)
        ... 40 more
Caused by: java.lang.ClassCastException: class de.javakaffee.web.msm.JavaSerializationTranscoderFactory
        at java.lang.Class.asSubclass(Class.java:3404)
        at de.javakaffee.web.msm.MemcachedSessionService.loadTranscoderFactoryClass(MemcachedSessionService.java:541)
        at de.javakaffee.web.msm.MemcachedSessionService.createTranscoderFactory(MemcachedSessionService.java:526)
        at de.javakaffee.web.msm.MemcachedSessionService.getTranscoderFactory(MemcachedSessionService.java:505)
        ... 44 more

I have tried other transcoder classes but they all result in a ClassCastException

Please could you advise whether I am missing any configuration or there is an issue with support for Tomcat 9 with a redis implementation

emmaLP avatar May 14 '19 10:05 emmaLP

Tried the latest jars in the tomcat lib folder

jedis-3.0.1.jar memcached-session-manager-tc9-2.3.2.jar memcached-session-manager-2.3.2.jar

However, I still get the same error

emmaLP avatar May 14 '19 10:05 emmaLP

Hi! Did you resolve this issue? I'm in the same situation.

jugaji avatar Sep 09 '22 11:09 jugaji

            已收到你的邮件,我会尽快与你联系回复!谢谢!!

LLY-SC avatar Sep 09 '22 11:09 LLY-SC

I had the similar issue. But in my case, I was putting the wrong path in the Context in server.xml This is works to me:

Changing this

<Context path="/" reloadable="false">
    <Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
             memcachedNodes="redis://localhost"
             sticky="true"
             ... others configs
             storageKeyPrefix="static:mykey" />
</Context>

Using /app

<Context path="/app" reloadable="false">
    <Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
             memcachedNodes="redis://localhost"
             sticky="true"
             ... others configs
             storageKeyPrefix="static:mykey" />
</Context>

Docker Image: tomcat:9-jdk17-corretto-al2

The tomcat lib folder contains the following jars:

  • jedis-3.0.0.jar
  • memcached-session-manager-tc9-2.3.2.jar
  • memcached-session-manager-2.3.2.jar

dilowagner avatar Oct 24 '23 00:10 dilowagner

            已收到你的邮件,我会尽快与你联系回复!谢谢!!

LLY-SC avatar Oct 24 '23 00:10 LLY-SC