2009-10-29 72 views
2

有没有人完成它呢?我有反序列化Grails会话对象的类加载器问题。会话群集Tomcat中的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] at org.codehaus.groovy .tools.RootLoader.loadClass (RootLoader.java:128) [exec] at org.codehaus.groovy.grails.cli.support.GrailsRootLoade (ClassLoader.java:404) [exec] at 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]在java.io.ObjectInputStream.readNonProxyDesc (ObjectInputStream.java:1575) [EXEC]在java.io.ObjectInputStream.readClassDesc (ObjectInputStream.java:1496) [EXEC]在java.io.ObjectInputStream.readOrdinaryObj ECT (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) [EXEC]在 net.spy.memcached.transcoders.SerializingTranscoder.decode (SerializingTranscoder.java:66)

回答

1

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

+0

我认为它是一个好主意,如果它是会话中唯一的Groovy对象,并且可以从持久存储的Tomcat的第二个实例恢复。但是我的程序很复杂,并且使用了Groovy和Java的混合,并且在会话中有各种各样的对象(这本身就是个问题 – Langali 2009-10-29 18:36:29

0

我只用过通过apache mod_proxy设置的粘性会话,所以从来没有尝试过跨节点共享会话数据。这对你来说是一种选择吗?

+0

我已经在做负载平衡了,但我现在需要更进一步。 – Langali 2009-10-29 22:11:36

0

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

"I had this issue in the past and I found a solution. The occurs because the memcached client it is loaded using a classloader and the serialized object class is loaded using another classloader. "

所以,在我的情况,我刚从EXT-lib目录移到分布式缓存,VERSION.jar到APP-lib目录(/ WEB-INF/lib目录)。然后,memcached客户端和应用程序类都在同一个ClassLoader中,并且此异常被清除。