会话群集Tomcat中的Grails应用程序

时间:2009-10-29 16:47:30

标签: java tomcat grails groovy load-balancing

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

这是错误:

WARN net.spy.memcached.transcoders.SerializingTranscoder:抓住了CNFE 解码1168字节的数据      [exec] java.lang.ClassNotFoundException:com.myapp.User      [exec] at org.codehaus.groovy.tools.RootLoader.findClass (RootLoader.java:156)      [exec] at java.lang.ClassLoader.loadClass(ClassLoader.java:319)      [exec]在org.codehaus.groovy.tools.RootLoader.loadClass (RootLoader.java:128)      [exec] at org.codehaus.groovy.grails.cli.support.GrailsRootLoader.loadClass (GrailsRootLoader.java:43)      [exec] at java.lang.ClassLoader.loadClass(ClassLoader.java:254)      [exec]在java.lang.ClassLoader.loadClassInternal (ClassLoader.java:402)      [exec] at java.lang.Class.forName0(Native Method)      [exec] at java.lang.Class.forName(Class.java:247)      [exec] at java.io.ObjectInputStream.resolveClass (ObjectInputStream.java:604)      [exec] at java.io.ObjectInputStream.readNonProxyDesc (ObjectInputStream.java:1575)      [exec]在java.io.ObjectInputStream.readClassDesc中 (ObjectInputStream.java:1496)      [exec] at java.io.ObjectInputStream.readOrdinaryObject (ObjectInputStream.java:1732)      [exec] at java.io.ObjectInputStream.readObject0 (ObjectInputStream.java:1329)      [exec] at java.io.ObjectInputStream.readObject (ObjectInputStream.java:351)      [exec] at net.spy.memcached.transcoders.BaseSerializingTranscoder.deserialize (BaseSerializingTranscoder.java:100)      [exec] at net.spy.memcached.transcoders.SerializingTranscoder.decode (SerializingTranscoder.java:66)

3 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

我之前只通过apache mod_proxy设置使用了粘性会话,所以从未尝试跨节点共享会话数据。这是你的选择吗?

答案 2 :(得分:0)

在开发环境中使用SpyMemcached时,我遇到了相同的CNFE问题。 SpyMemcached的CNFE(ClassNotFoundException)主要由JVM中的多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中,并清除此异常。