【问题标题】:hazelcast tomcat session not loading classes from app contexthazelcast tomcat 会话未从应用程序上下文加载类
【发布时间】:2016-12-29 14:39:30
【问题描述】:

我正在尝试在 tomcat 服务器上实现 hazelcast 会话。
我在 tomcat7/lib 中放入了以下 jars: hazelcast-tomcat8-sessionmanager-1.0.3.jar, hazelcast-3.7.4.jar 和 hazelcast-client-3.7.4.jar。 在 tomcat8/conf/server.xml 我有:

<Listener className="com.hazelcast.session.ClientServerLifecycleListener" />

在tomcat8/conf/Catalina/localhost/app.xml中:

<Manager className="com.hazelcast.session.HazelcastSessionManager"
            clientOnly="true"/>

似乎一切都开始正常,但当我访问应用程序时,我得到:

 29-Dec-2016 16:24:08.073 SEVERE [http-nio-8443-exec-8] org.apache.coyote.http11.AbstractHttp11Processor.process Error processing arequest
 com.hazelcast.nio.serialization.HazelcastSerializationException: java.lang.ClassNotFoundException: org.springframework.security.ui.savedrequest.SavedRequest
        at com.hazelcast.internal.serialization.impl.JavaDefaultSerializers$JavaSerializer.read(JavaDefaultSerializers.java:224)
        at com.hazelcast.internal.serialization.impl.StreamSerializerAdapter.read(StreamSerializerAdapter.java:48)
        at com.hazelcast.internal.serialization.impl.AbstractSerializationService.readObject(AbstractSerializationService.java:251)
        at com.hazelcast.internal.serialization.impl.ByteArrayObjectDataInput.readObject(ByteArrayObjectDataInput.java:600)
        at com.hazelcast.session.HazelcastSession.deserializeMap(HazelcastSession.java:141)
        at com.hazelcast.session.HazelcastSession.readData(HazelcastSession.java:127)
        at com.hazelcast.internal.serialization.impl.DataSerializableSerializer.readInternal(DataSerializableSerializer.java:151)
        at com.hazelcast.internal.serialization.impl.DataSerializableSerializer.read(DataSerializableSerializer.java:104)
        at com.hazelcast.internal.serialization.impl.DataSerializableSerializer.read(DataSerializableSerializer.java:54)
        at com.hazelcast.internal.serialization.impl.StreamSerializerAdapter.read(StreamSerializerAdapter.java:48)
        at com.hazelcast.internal.serialization.impl.AbstractSerializationService.toObject(AbstractSerializationService.java:172)
        at com.hazelcast.client.spi.ClientProxy.toObject(ClientProxy.java:186)
        at com.hazelcast.client.proxy.ClientMapProxy.getInternal(ClientMapProxy.java:247)
        at com.hazelcast.client.proxy.ClientMapProxy.get(ClientMapProxy.java:240)
        at com.hazelcast.session.HazelcastSessionManager.findSession(HazelcastSessionManager.java:222)
        at org.apache.catalina.connector.Request.isRequestedSessionIdValid(Request.java:2381)
        at org.apache.catalina.connector.CoyoteAdapter.parseSessionCookiesId(CoyoteAdapter.java:1250)
        at org.apache.catalina.connector.CoyoteAdapter.postParseRequest(CoyoteAdapter.java:935)
        at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:523)
        at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1099)
        at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:670)
        at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1520)
        at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1476)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
        at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
        at java.lang.Thread.run(Thread.java:745)
Caused by: java.lang.ClassNotFoundException: org.springframework.security.ui.savedrequest.SavedRequest
        at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
        at com.hazelcast.nio.ClassLoaderUtil.tryLoadClass(ClassLoaderUtil.java:151)
        at com.hazelcast.nio.ClassLoaderUtil.loadClass(ClassLoaderUtil.java:120)
        at com.hazelcast.nio.IOUtil$ClassLoaderAwareObjectInputStream.resolveClass(IOUtil.java:358)
        at java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1620)
        at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1521)
        at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1781)
        at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1353)
        at java.io.ObjectInputStream.readObject(ObjectInputStream.java:373)
        at com.hazelcast.internal.serialization.impl.JavaDefaultSerializers$JavaSerializer.read(JavaDefaultSerializers.java:219)
        ... 26 more

有人知道我做错了什么吗?谢谢

【问题讨论】:

  • 显然 spring-security-web-xxx.jar 在您的类路径/库中丢失。 HazelcastSessionManager 依赖于这个 jar。
  • 您使用的是哪个 Tomcat 版本? 8.0.39 还是 8.5.x?
  • 该应用程序在没有 hazelcast 的情况下运行良好。这是一个在生产中运行了 5 年的应用程序,它具有所有依赖项。
  • tomcat-session推荐的tomcat,意思是8.0.36。
  • 我无法重现您的问题。我刚刚注意到您在tomcat8/conf/Catalina/localhost/app.xml 中定义了&lt;Manager&gt; 元素,但是hazelcast-tomcat-sessionmanager 页面(github.com/hazelcast/…)说它应该在$CATALINA_HOME$/conf/context.xml 中定义。你能试试看它是否有效?

标签: session tomcat hazelcast


【解决方案1】:

似乎有些东西改变了你当前线程的上下文ClassLoader,所以 Hazelcast 的序列化服务找不到类。我在 Hazelcast Tomcat Session Manager 的 GitHub 存储库上为此创建了一个 issue。您可以在那里跟踪进度。

编辑:
您能否将 hazelcast-tomcat8-sessionmanager-1.0.3.jar 替换为 this page 上的 JAR,其中包含对该问题的暂定修复,如果它解决了问题,请告诉我?

【讨论】:

  • 我想现在它看到了 corect ClassLoader。但我现在有另一个问题。我还在应用程序中实现了 hazelcast 2 级缓存。我现在得到了这个:SEVERE: Hazelcast Client could not be created. java.lang.IllegalArgumentException: Type id must be positive! Current: -200, Serializer: com.hazelcast.hibernate.serialization.Hibernate3CacheKeySerializer@6d6646ac at com.hazelcast.internal.serialization.impl.AbstractSerializationService.register(AbstractSerializationService.java:346)
  • 似乎 hazelcast 会在类路径中扫描 jar 以查找类序列化程序,并在 hazelcast-hibernate 上找到这些 jar 并抛出错误。
  • @dinulaurentiu 您的新问题似乎与这个问题相同:stackoverflow.com/questions/32637634/… 和旧 GitHub 存储库上的这个问题 (github.com/hazelcast/hazelcast-hibernate4/issues/3)。我将在 Hazelcast Hibernate 官方插件 GitHub 存储库中创建一个新问题来解决这个问题。
猜你喜欢
  • 1970-01-01
  • 2018-08-11
  • 1970-01-01
  • 2013-05-05
  • 1970-01-01
  • 1970-01-01
  • 2011-04-25
  • 1970-01-01
  • 2021-03-01
相关资源
最近更新 更多