有人做过吗?我有类加载器问题反序列化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)
答案 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中,并清除此异常。