diff options
| author | Robert Gemmell <robbie@apache.org> | 2010-08-27 20:25:28 +0000 |
|---|---|---|
| committer | Robert Gemmell <robbie@apache.org> | 2010-08-27 20:25:28 +0000 |
| commit | b16bd3f6e83152eace352a47e78424db8df4171e (patch) | |
| tree | 24adb9ab36092a9336fa0fc11111aab4e86c2c5d /java/management/eclipse-plugin/src | |
| parent | d89ed290d19f7515661ae1bd2dab6f1857e31182 (diff) | |
| download | qpid-python-b16bd3f6e83152eace352a47e78424db8df4171e.tar.gz | |
QPID-2788: synchronize the concurrently accessed arraylists. Return new instances of the lists to prevent extended synchronized iterations during view updates from delaying the notification threads
git-svn-id: https://svn.apache.org/repos/asf/qpid/trunk/qpid@990253 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'java/management/eclipse-plugin/src')
| -rw-r--r-- | java/management/eclipse-plugin/src/main/java/org/apache/qpid/management/ui/ServerRegistry.java | 47 |
1 files changed, 38 insertions, 9 deletions
diff --git a/java/management/eclipse-plugin/src/main/java/org/apache/qpid/management/ui/ServerRegistry.java b/java/management/eclipse-plugin/src/main/java/org/apache/qpid/management/ui/ServerRegistry.java index 027a555360..fc17538cf9 100644 --- a/java/management/eclipse-plugin/src/main/java/org/apache/qpid/management/ui/ServerRegistry.java +++ b/java/management/eclipse-plugin/src/main/java/org/apache/qpid/management/ui/ServerRegistry.java @@ -32,6 +32,8 @@ import org.apache.qpid.management.ui.model.ManagedAttributeModel; import org.apache.qpid.management.ui.model.NotificationObject; import org.apache.qpid.management.ui.model.OperationDataModel; +import java.util.Collections; + public abstract class ServerRegistry { private ManagedServer _managedServer = null; @@ -95,22 +97,34 @@ public abstract class ServerRegistry protected void addConnectionMBean(ManagedBean mbean) { String vHost = mbean.getVirtualHostName(); - _connections.putIfAbsent(vHost, new ArrayList<ManagedBean>()); - _connections.get(vHost).add(mbean); + List<ManagedBean> vhostConnections = getVhostSubList(vHost, _connections); + vhostConnections.add(mbean); } protected void addExchangeMBean(ManagedBean mbean) { String vHost = mbean.getVirtualHostName(); - _exchanges.putIfAbsent(vHost, new ArrayList<ManagedBean>()); - _exchanges.get(vHost).add(mbean); + List<ManagedBean> vhostExchanges = getVhostSubList(vHost, _exchanges); + vhostExchanges.add(mbean); } protected void addQueueMBean(ManagedBean mbean) { String vHost = mbean.getVirtualHostName(); - _queues.putIfAbsent(vHost, new ArrayList<ManagedBean>()); - _queues.get(vHost).add(mbean); + List<ManagedBean> vhostQueues = getVhostSubList(vHost, _queues); + vhostQueues.add(mbean); + } + + private List<ManagedBean> getVhostSubList(String vHost, ConcurrentMap<String,List<ManagedBean>> parentList) + { + //add an empty sublist for the vhost if required + if (!parentList.containsKey(vHost)) + { + List<ManagedBean> subList = Collections.synchronizedList(new ArrayList<ManagedBean>()); + parentList.putIfAbsent(vHost, subList); + } + + return parentList.get(vHost); } protected void addVirtualHostManagerMBean(ManagedBean mbean) @@ -146,17 +160,32 @@ public abstract class ServerRegistry public List<ManagedBean> getConnections(String virtualHost) { - return _connections.get(virtualHost); + return getVhostObjects(virtualHost, _connections); } public List<ManagedBean> getExchanges(String virtualHost) { - return _exchanges.get(virtualHost); + return getVhostObjects(virtualHost, _exchanges); } public List<ManagedBean> getQueues(String virtualHost) { - return _queues.get(virtualHost); + return getVhostObjects(virtualHost, _queues); + } + + public List<ManagedBean> getVhostObjects(String virtualHost, ConcurrentMap<String,List<ManagedBean>> parentList) + { + List<ManagedBean> objects = parentList.get(virtualHost); + + if(objects == null) + { + return new ArrayList<ManagedBean>(); + } + + synchronized (objects) + { + return new ArrayList<ManagedBean>(objects); + } } //returns the requested ManagedBean, or null if it cant be found |
