cxf-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From dk...@apache.org
Subject [1/2] git commit: Fix a race condition that could cause many conduits to be created when only one is needed
Date Tue, 01 Apr 2014 20:53:53 GMT
Repository: cxf
Updated Branches:
  refs/heads/master 5b17d24cc -> 1f7d6ad5c


Fix a race condition that could cause many conduits to be created when only one is needed


Project: http://git-wip-us.apache.org/repos/asf/cxf/repo
Commit: http://git-wip-us.apache.org/repos/asf/cxf/commit/7d30cc4a
Tree: http://git-wip-us.apache.org/repos/asf/cxf/tree/7d30cc4a
Diff: http://git-wip-us.apache.org/repos/asf/cxf/diff/7d30cc4a

Branch: refs/heads/master
Commit: 7d30cc4af87f0e33ffbc6754c8551e46343916c1
Parents: 5b17d24
Author: Daniel Kulp <dkulp@apache.org>
Authored: Tue Apr 1 15:59:05 2014 -0400
Committer: Daniel Kulp <dkulp@apache.org>
Committed: Tue Apr 1 16:53:46 2014 -0400

----------------------------------------------------------------------
 .../cxf/endpoint/AbstractConduitSelector.java   | 58 +++++++++++++-------
 1 file changed, 37 insertions(+), 21 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cxf/blob/7d30cc4a/core/src/main/java/org/apache/cxf/endpoint/AbstractConduitSelector.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/cxf/endpoint/AbstractConduitSelector.java b/core/src/main/java/org/apache/cxf/endpoint/AbstractConduitSelector.java
index 40d1864..7a3f989 100644
--- a/core/src/main/java/org/apache/cxf/endpoint/AbstractConduitSelector.java
+++ b/core/src/main/java/org/apache/cxf/endpoint/AbstractConduitSelector.java
@@ -104,26 +104,7 @@ public abstract class AbstractConduitSelector implements ConduitSelector,
Closea
                     ConduitInitiator conduitInitiator =
                         conduitInitiatorMgr.getConduitInitiator(transportID);
                     if (conduitInitiator != null) {
-                        String add = (String)message.get(Message.ENDPOINT_ADDRESS);
-                        String basePath = (String)message.get(Message.BASE_PATH);
-                        if (StringUtils.isEmpty(add)
-                            || add.equals(ei.getAddress())) {
-                            c = conduitInitiator.getConduit(ei, exchange.getBus());
-                            replaceEndpointAddressPropertyIfNeeded(message, add, c);
-                        } else {
-                            EndpointReferenceType epr = new EndpointReferenceType();
-                            AttributedURIType ad = new AttributedURIType();
-                            ad.setValue(StringUtils.isEmpty(basePath) ? add : basePath);
-                            epr.setAddress(ad);
-                            c = conduitInitiator.getConduit(ei, epr, exchange.getBus());
-                        }
-                        MessageObserver observer = 
-                            exchange.get(MessageObserver.class);
-                        if (observer != null) {
-                            c.setMessageObserver(observer);
-                        } else {
-                            getLogger().warning("MessageObserver not found");
-                        }
+                        c = createConduit(message, exchange, conduitInitiator);
                     } else {
                         getLogger().warning("ConduitInitiator not found: "
                                             + ei.getAddress());
@@ -136,7 +117,6 @@ public abstract class AbstractConduitSelector implements ConduitSelector,
Closea
             } catch (IOException ex) {
                 throw new Fault(ex);
             }
-            conduits.add(c);
         } 
         if (c != null && c.getTarget() != null && c.getTarget().getAddress()
!= null) {
             replaceEndpointAddressPropertyIfNeeded(message, c.getTarget().getAddress().getValue(),
c);
@@ -146,6 +126,42 @@ public abstract class AbstractConduitSelector implements ConduitSelector,
Closea
         message.put(Conduit.class, c);
         return c;
     }
+    
+    protected Conduit createConduit(Message message, Exchange exchange, ConduitInitiator
conduitInitiator) 
+        throws IOException {
+        Conduit c = null;
+        synchronized (endpoint) {
+            if (!conduits.isEmpty()) {
+                c = findCompatibleConduit(message);
+                if (c != null) {
+                    return c;
+                }
+            }
+            EndpointInfo ei = endpoint.getEndpointInfo();
+            String add = (String)message.get(Message.ENDPOINT_ADDRESS);
+            String basePath = (String)message.get(Message.BASE_PATH);
+            if (StringUtils.isEmpty(add)
+                || add.equals(ei.getAddress())) {
+                c = conduitInitiator.getConduit(ei, exchange.getBus());
+                replaceEndpointAddressPropertyIfNeeded(message, add, c);
+            } else {
+                EndpointReferenceType epr = new EndpointReferenceType();
+                AttributedURIType ad = new AttributedURIType();
+                ad.setValue(StringUtils.isEmpty(basePath) ? add : basePath);
+                epr.setAddress(ad);
+                c = conduitInitiator.getConduit(ei, epr, exchange.getBus());
+            }
+            MessageObserver observer = 
+                exchange.get(MessageObserver.class);
+            if (observer != null) {
+                c.setMessageObserver(observer);
+            } else {
+                getLogger().warning("MessageObserver not found");
+            }
+            conduits.add(c);
+        }
+        return c;
+    }
 
     // Some conduits may replace the endpoint address after it has already been prepared
     // but before the invocation has been done (ex, org.apache.cxf.clustering.LoadDistributorTargetSelector)


Mime
View raw message