Shiro Eh Cache ConcurrenctModificationException

时间:2013-07-23 09:21:23

标签: java-ee web-applications ehcache shiro concurrentmodification

我最近在我的webapp中添加了带有EH Cache的Shiro,从那时起我看到了一些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 /'。两个模块都在不同的缓存/会话上运行Shiro(即还没有SSO)他们共享的唯一内容是3个cookie:locale / currency / cookie-consent。 我不认为它来自cookie,因为它们是在请求开始时访问的(即当离开ROOT进入应用程序时,只有应用程序访问cookie并将语言环境保存在会话中)。

可能导致问题的原因是什么?

---------------编辑-------- 这是一个更详细的堆栈跟踪。 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 ------------------

我想我找到了问题的根源。我有一个方法在会话中存储一些String属性。该应用程序没有它工作正常,一旦我取消注释它的问题就会回来。 我不明白这是导致并发修改异常的原因:此方法仅在会话中保存字符串,并且只有一个线程访问会话。有线索吗?

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

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

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

0 个答案:

没有答案