You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cxf.apache.org by dk...@apache.org on 2012/08/30 19:51:59 UTC

svn commit: r1379037 - in /cxf/trunk: rt/transports/http/src/main/java/org/apache/cxf/transport/http/ systests/jaxws/src/test/java/org/apache/cxf/systest/jaxws/

Author: dkulp
Date: Thu Aug 30 17:51:59 2012
New Revision: 1379037

URL: http://svn.apache.org/viewvc?rev=1379037&view=rev
Log:
More updates to make it easier to wire in the Async based conduit
With the async client, we HAVE to put the response on the workqueue or threads will block.

Modified:
    cxf/trunk/rt/transports/http/src/main/java/org/apache/cxf/transport/http/HTTPConduit.java
    cxf/trunk/rt/transports/http/src/main/java/org/apache/cxf/transport/http/HTTPTransportFactory.java
    cxf/trunk/rt/transports/http/src/main/java/org/apache/cxf/transport/http/URLConnectionHTTPConduit.java
    cxf/trunk/systests/jaxws/src/test/java/org/apache/cxf/systest/jaxws/ClientServerTest.java

Modified: cxf/trunk/rt/transports/http/src/main/java/org/apache/cxf/transport/http/HTTPConduit.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/transports/http/src/main/java/org/apache/cxf/transport/http/HTTPConduit.java?rev=1379037&r1=1379036&r2=1379037&view=diff
==============================================================================
--- cxf/trunk/rt/transports/http/src/main/java/org/apache/cxf/transport/http/HTTPConduit.java (original)
+++ cxf/trunk/rt/transports/http/src/main/java/org/apache/cxf/transport/http/HTTPConduit.java Thu Aug 30 17:51:59 2012
@@ -1109,7 +1109,7 @@ public abstract class HTTPConduit 
         protected abstract void updateCookiesBeforeRetransmit() throws IOException;
 
         
-        protected void handleResponseOnWorkqueue(boolean allowCurrentThread) throws IOException {
+        protected void handleResponseOnWorkqueue(boolean allowCurrentThread, boolean forceWQ) throws IOException {
             Runnable runnable = new Runnable() {
                 public void run() {
                     try {
@@ -1125,7 +1125,18 @@ public abstract class HTTPConduit 
             HTTPClientPolicy policy = getClient(outMessage);
             try {
                 Executor ex = outMessage.getExchange().get(Executor.class);
-                if (ex == null) {
+                if (forceWQ && ex != null) {
+                    final Executor ex2 = ex;
+                    final Runnable origRunnable = runnable;
+                    runnable = new Runnable() {
+                        public void run() {
+                            outMessage.getExchange().put(Executor.class.getName() 
+                                                         + ".USING_SPECIFIED", Boolean.TRUE);
+                            ex2.execute(origRunnable);
+                        }
+                    };
+                }
+                if (ex == null || forceWQ) {
                     WorkQueueManager mgr = outMessage.getExchange().get(Bus.class)
                         .getExtension(WorkQueueManager.class);
                     AutomaticWorkQueue qu = mgr.getNamedWorkQueue("http-conduit");

Modified: cxf/trunk/rt/transports/http/src/main/java/org/apache/cxf/transport/http/HTTPTransportFactory.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/transports/http/src/main/java/org/apache/cxf/transport/http/HTTPTransportFactory.java?rev=1379037&r1=1379036&r2=1379037&view=diff
==============================================================================
--- cxf/trunk/rt/transports/http/src/main/java/org/apache/cxf/transport/http/HTTPTransportFactory.java (original)
+++ cxf/trunk/rt/transports/http/src/main/java/org/apache/cxf/transport/http/HTTPTransportFactory.java Thu Aug 30 17:51:59 2012
@@ -62,6 +62,14 @@ public class HTTPTransportFactory 
     extends AbstractTransportFactory 
     implements WSDLEndpointFactory, ConduitInitiator, DestinationFactory {
     
+
+    public interface HTTPConduitFactory {
+        HTTPConduit createConduit(HTTPTransportFactory f,
+                                  EndpointInfo localInfo,
+                                  EndpointReferenceType target) throws IOException;
+    }
+        
+    
     public static final List<String> DEFAULT_NAMESPACES 
         = Arrays.asList(
             "http://cxf.apache.org/transports/http",
@@ -247,7 +255,16 @@ public class HTTPTransportFactory 
             EndpointInfo endpointInfo,
             EndpointReferenceType target
     ) throws IOException {
-        HTTPConduit conduit = new URLConnectionHTTPConduit(bus, endpointInfo, target);
+        
+        HTTPConduitFactory factory = findFactory(endpointInfo);
+        HTTPConduit conduit = null;
+        if (factory != null) {
+            conduit = factory.createConduit(this, endpointInfo, target);
+        }
+        if (conduit == null) {
+            conduit = new URLConnectionHTTPConduit(bus, endpointInfo, target);
+        }
+
         // Spring configure the conduit.  
         String address = conduit.getAddress();
         if (address != null && address.indexOf('?') != -1) {
@@ -262,6 +279,13 @@ public class HTTPTransportFactory 
         return conduit;
     }
     
+    protected HTTPConduitFactory findFactory(EndpointInfo endpointInfo) {
+        HTTPConduitFactory f = endpointInfo.getProperty(HTTPConduitFactory.class.getName(), HTTPConduitFactory.class);
+        if (f == null) {
+            f = bus.getExtension(HTTPConduitFactory.class);
+        }
+        return f;
+    }
     public Destination getDestination(EndpointInfo endpointInfo) throws IOException {
         if (endpointInfo == null) {
             throw new IllegalArgumentException("EndpointInfo cannot be null");

Modified: cxf/trunk/rt/transports/http/src/main/java/org/apache/cxf/transport/http/URLConnectionHTTPConduit.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/transports/http/src/main/java/org/apache/cxf/transport/http/URLConnectionHTTPConduit.java?rev=1379037&r1=1379036&r2=1379037&view=diff
==============================================================================
--- cxf/trunk/rt/transports/http/src/main/java/org/apache/cxf/transport/http/URLConnectionHTTPConduit.java (original)
+++ cxf/trunk/rt/transports/http/src/main/java/org/apache/cxf/transport/http/URLConnectionHTTPConduit.java Thu Aug 30 17:51:59 2012
@@ -200,7 +200,7 @@ public class URLConnectionHTTPConduit ex
             cookies.readFromHeaders(h);
         }
         protected void handleResponseAsync() throws IOException {
-            handleResponseOnWorkqueue(true);
+            handleResponseOnWorkqueue(true, false);
         }
         protected void updateCookiesBeforeRetransmit() {
             Headers h = new Headers();

Modified: cxf/trunk/systests/jaxws/src/test/java/org/apache/cxf/systest/jaxws/ClientServerTest.java
URL: http://svn.apache.org/viewvc/cxf/trunk/systests/jaxws/src/test/java/org/apache/cxf/systest/jaxws/ClientServerTest.java?rev=1379037&r1=1379036&r2=1379037&view=diff
==============================================================================
--- cxf/trunk/systests/jaxws/src/test/java/org/apache/cxf/systest/jaxws/ClientServerTest.java (original)
+++ cxf/trunk/systests/jaxws/src/test/java/org/apache/cxf/systest/jaxws/ClientServerTest.java Thu Aug 30 17:51:59 2012
@@ -36,6 +36,7 @@ import java.util.concurrent.Executor;
 import java.util.concurrent.ExecutorService;
 import java.util.concurrent.Executors;
 import java.util.concurrent.Future;
+import java.util.concurrent.atomic.AtomicInteger;
 import java.util.logging.Logger;
 
 import javax.xml.namespace.QName;
@@ -551,16 +552,16 @@ public class ClientServerTest extends Ab
         
         class TestExecutor implements Executor {
             
-            private int count;
+            private AtomicInteger count = new AtomicInteger();
             
             public void execute(Runnable command) {
-                count++;
-                LOG.info("asyn call time " + count);
+                int c = count.incrementAndGet();
+                LOG.info("asyn call time " + c);
                 command.run();
             }
             
             public int getCount() {
-                return count;
+                return count.get();
             }
         }
         Executor executor = new TestExecutor();