2009-10-29 29 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中,並且此異常被清除。