Today I run again into my old problem with the PortletStateHolder. While he is under fire he throws a lot of ConcurrentModificationExceptions.
Here is one of these Exceptions:
Caused by: java.util.ConcurrentModificationException
at java.util.LinkedHashMap$LinkedHashIterator.nextEntry(LinkedHashMap.java:373)
at java.util.LinkedHashMap$KeyIterator.next(LinkedHashMap.java:384)
at de.koelnerwasser.portlet.bridge.MyPortletStateHolder
.removeSessionStates(MyPortletStateHolder.javaa:198)
Because I synchronized every write access to the class variable “states” eg.:
public void addWindowState(StateId stateId, PortletWindowState state) {
// prevent concurrent access
synchronized (states) {
states.put(stateId, state);
}
}
I wonder about the exceptions. So I investigated the read access to “states” in the “getWindowState()” method:
public PortletWindowState getWindowState(StateId stateId) {
PortletWindowState state = null;
if (null != stateId) {
state = states.get(stateId);
}
return state;
}
I found that states.get() calls a put on the org.apache.commons.collections.LRUMap. Here is the code:
public Object get(Object key)
{
if(!containsKey(key))
{
return null;
} else {
Object value = remove(key);
super.put(key, value);
return value;
}
The put() call causes the ConcurrentModificationException. The solution is to synchronize every call on the state LRUMap.
Added to the project JIRA as https://jira.jboss.org/jira/browse/PBR-149. Can you describe please what version of bridge are you use and you portal environment ?
Hello Alex, sorry that I didn’t wrote a JIRA entry, I just forgot my JBoss Account password and didn’t want to create a new account…
Now the account is created and I will attach the requested information to the issue in a few minutes.
My brother suggested I might like this website. He was entirely right.
This post truly made my day. You can not imagine simply
how much time I had spent for this info! Thanks!