0

我最近将带有 EH 缓存的 Shiro 添加到我的 web 应用程序中,从那时起我看到了一些 ConcurrentModificationException:

[shiro-active%0053ession%0043ache.data] ERROR net.sf.ehcache.store.disk.DiskStorageFactory - Disk Write of 3ae3f634-cd97-4614-bd04-517d81623971 failed: 
net.sf.ehcache.CacheException: Failed to serialize element due to ConcurrentModificationException. This is frequently the result of inappropriately sharing thread unsafe object (eg. ArrayList, HashMap, etc) between threads
at net.sf.ehcache.store.disk.DiskStorageFactory.serializeElement(DiskStorageFactory.java:401)
at net.sf.ehcache.store.disk.DiskStorageFactory.write(DiskStorageFactory.java:381)
at net.sf.ehcache.store.disk.DiskStorageFactory$DiskWriteTask.call(DiskStorageFactory.java:473)
at net.sf.ehcache.store.disk.DiskStorageFactory$PersistentDiskWriteTask.call(DiskStorageFactory.java:1067)
at net.sf.ehcache.store.disk.DiskStorageFactory$PersistentDiskWriteTask.call(DiskStorageFactory.java:1051)
at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:334)
at java.util.concurrent.FutureTask.run(FutureTask.java:166)

我遇到的问题是堆栈跟踪没有提供太多关于代码中问题所在的信息,而且 webapp 非常大。

任何有关如何查找和修复错误的提示将不胜感激。

编辑:当用户从 ROOT 模块“www.my-site.com/”转到应用程序模块“www.my-site.com/app/”时,似乎会出现问题。两个模块都在不同的缓存/会话(即还没有 SSO)上运行 Shiro,它们唯一共享的是 3 个 cookie:语言环境/货币/cookie 同意。我不认为它来自 cookie,因为它们是在请求开始时访问的(即,当离开 ROOT 以访问应用程序时,只有应用程序访问 cookie 并将语言环境保存在会话中)。

知道可能导致问题的原因吗?

---------------EDIT -------- 这是更详细的堆栈跟踪。Shiro 的简单会话似乎起了作用:

Caused by: java.util.ConcurrentModificationException
at java.util.HashMap$HashIterator.nextEntry(HashMap.java:806)
at java.util.HashMap$EntryIterator.next(HashMap.java:847)
at java.util.HashMap$EntryIterator.next(HashMap.java:845)
at java.util.HashMap.writeObject(HashMap.java:1012)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:601)
at java.io.ObjectStreamClass.invokeWriteObject(ObjectStreamClass.java:962)
at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1480)
at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1416)
at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1174)
at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:346)
at org.apache.shiro.session.mgt.SimpleSession.writeObject(SimpleSession.java:461)

-------------编辑2 ------------------

我想我找到了问题的根源。我有一个在会话中存储一些字符串属性的方法。没有它,该应用程序可以正常工作,一旦我取消注释,问题就会再次出现。我不明白的是为什么会导致并发修改异常:这种方法只是在会话中保存字符串,并且只有一个线程访问会话。有什么线索吗?

-----------编辑3 -------

我用 4 个 POJO 替换了字符串。现在异常只在用户第一次登陆页面时发生一次(就在开始执行 doGet(...) 代码之前。

这似乎不会产生任何工作问题,所以我现在可能会忽略它。如果有人明白发生了什么,请给我一个喊叫。

4

0 回答 0