You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@activemq.apache.org by de...@apache.org on 2010/11/22 12:34:39 UTC

svn commit: r1037675 - /activemq/trunk/activemq-core/src/main/java/org/apache/activemq/broker/TransactionBroker.java

Author: dejanb
Date: Mon Nov 22 11:34:39 2010
New Revision: 1037675

URL: http://svn.apache.org/viewvc?rev=1037675&view=rev
Log:
https://issues.apache.org/activemq/browse/AMQ-2950 - prevent ConcurrentModificationException when removing the connection

Modified:
    activemq/trunk/activemq-core/src/main/java/org/apache/activemq/broker/TransactionBroker.java

Modified: activemq/trunk/activemq-core/src/main/java/org/apache/activemq/broker/TransactionBroker.java
URL: http://svn.apache.org/viewvc/activemq/trunk/activemq-core/src/main/java/org/apache/activemq/broker/TransactionBroker.java?rev=1037675&r1=1037674&r2=1037675&view=diff
==============================================================================
--- activemq/trunk/activemq-core/src/main/java/org/apache/activemq/broker/TransactionBroker.java (original)
+++ activemq/trunk/activemq-core/src/main/java/org/apache/activemq/broker/TransactionBroker.java Mon Nov 22 11:34:39 2010
@@ -16,11 +16,8 @@
  */
 package org.apache.activemq.broker;
 
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.LinkedHashMap;
-import java.util.List;
-import java.util.Map;
+
+import java.util.*;
 import java.util.concurrent.ConcurrentHashMap;
 
 import javax.jms.JMSException;
@@ -252,15 +249,25 @@ public class TransactionBroker extends B
             iter.remove();
         }
 
+        synchronized (xaTransactions) {
+            // first find all txs that belongs to the connection
+            ArrayList<XATransaction> txs = new ArrayList<XATransaction>();
+            for (XATransaction tx : xaTransactions.values()) {
+                if (tx.getConnectionId().equals(info.getConnectionId()) && !tx.isPrepared()) {
+                    txs.add(tx);
+                }
+            }
+
+            // then remove them
+            // two steps needed to avoid ConcurrentModificationException, from removeTransaction()
+            for (XATransaction tx : txs) {
+                try {
+                    tx.rollback();
+                } catch (Exception e) {
+                    LOG.warn("ERROR Rolling back disconnected client's xa transactions: ", e);
+                }
+            }
 
-        for (XATransaction tx : xaTransactions.values()) {
-           try {
-             if (tx.getConnectionId().equals(info.getConnectionId()) && !tx.isPrepared()) {
-                tx.rollback();
-             }
-           } catch (Exception e) {
-               LOG.warn("ERROR Rolling back disconnected client's xa transactions: ", e);
-           }
         }
         next.removeConnection(context, info, error);
     }