【问题标题】:Session Clustering a Grails app in Tomcat在 Tomcat 中对 Grails 应用程序进行会话集群
【发布时间】:2009-10-29 16:47:29
【问题描述】:

有人做过吗?我在反序列化 grails 会话对象时遇到类加载器问题。

这里是错误:

警告 net.spy.memcached.transcoders.SerializingTranscoder: Caught CNFE 解码 1168 字节数据 [执行] java.lang.ClassNotFoundException: com.myapp.User [执行] 在 org.codehaus.groovy.tools.RootLoader.findClass (RootLoader.java:156) [exec] 在 java.lang.ClassLoader.loadClass(ClassLoader.java:319) [执行] 在 org.codehaus.groovy.tools.RootLoader.loadClass (RootLoader.java:128) [执行] 在 org.codehaus.groovy.grails.cli.support.GrailsRootLoader.loadClass (GrailsRootLoader.java:43) [exec] 在 java.lang.ClassLoader.loadClass(ClassLoader.java:254) [exec] 在 java.lang.ClassLoader.loadClassInternal (ClassLoader.java:402) [exec] 在 java.lang.Class.forName0(本机方法) [exec] 在 java.lang.Class.forName(Class.java:247) [exec] 在 java.io.ObjectInputStream.resolveClass (ObjectInputStream.java:604) [exec] 在 java.io.ObjectInputStream.readNonProxyDesc (ObjectInputStream.java:1575) [exec] 在 java.io.ObjectInputStream.readClassDesc (ObjectInputStream.java:1496) [exec] 在 java.io.ObjectInputStream.readOrdinaryObject (ObjectInputStream.java:1732) [exec] 在 java.io.ObjectInputStream.readObject0 (ObjectInputStream.java:1329) [exec] 在 java.io.ObjectInputStream.readObject (ObjectInputStream.java:351) [执行] 在 net.spy.memcached.transcoders.BaseSerializingTranscoder.deserialize (BaseSerializingTranscoder.java:100) [执行] 在 net.spy.memcached.transcoders.SerializingTranscoder.decode (SerializingTranscoder.java:66)

【问题讨论】:

    标签: java tomcat grails groovy load-balancing


    【解决方案1】:

    我想没有简单的方法可以修复它,因为 Grails 使用自定义类加载器来加载域类(我假设 com.myapp.User 类是域类)。作为一种解决方法,您可以将用户的 id 存储在会话中,并使用我描述的here 之类的技术在每次请求时检索它。这也将提供减少需要复制的会话大小的好处。

    【讨论】:

    • 我认为如果它是会话中唯一的 Groovy 对象并且可以从持久存储的第二个 Tomcat 实例中恢复,这是一个好主意。但是我的是一个复杂的应用程序,它混合使用了 Groovy 和 Java,并且在会话中有各种对象(这本身就是一个问题
    【解决方案2】:

    我只通过 apache mod_proxy 设置使用过粘性会话,因此从未尝试跨节点共享会话数据。这对你来说是一个选择吗?

    【讨论】:

    • 我已经在做负载均衡了,但我现在需要更进一步。
    【解决方案3】:

    我在开发环境中使用 SpyMemcached 时遇到了同样的 CNFE 问题。 SpyMemcached的CNFE(ClassNotFoundException),主要由JVM中的multi ClassLoader生成。搜索这篇文章:http://code.google.com/p/spymemcached/issues/detail?id=155,找到:

    “我过去遇到过这个问题,我找到了解决方案。发生了 因为 memcached 客户端是使用类加载器加载的,并且 序列化的对象类是使用另一个类加载器加载的。 "

    所以,就我而言,我只是将 memcached-VERSION.jar 从 ext-lib 目录移动到 app-lib 目录 (/WEB-INF/lib)。那么memcached客户端和app类都在同一个ClassLoader中,这个异常就被清除了。

    【讨论】:

      猜你喜欢
      • 2014-08-04
      • 2011-12-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-10
      • 1970-01-01
      • 2019-11-20
      • 1970-01-01
      相关资源
      最近更新 更多