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 2009/02/03 10:26:06 UTC

svn commit: r740255 - in /cxf/trunk: rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/JaxWsClientProxy.java systests/src/test/java/org/apache/cxf/systest/jaxws/ClientServerTest.java

Author: dkulp
Date: Tue Feb  3 09:26:05 2009
New Revision: 740255

URL: http://svn.apache.org/viewvc?rev=740255&view=rev
Log:
[CXF-2011] Fix a race condition in the async client callbacks

Modified:
    cxf/trunk/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/JaxWsClientProxy.java
    cxf/trunk/systests/src/test/java/org/apache/cxf/systest/jaxws/ClientServerTest.java

Modified: cxf/trunk/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/JaxWsClientProxy.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/JaxWsClientProxy.java?rev=740255&r1=740254&r2=740255&view=diff
==============================================================================
--- cxf/trunk/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/JaxWsClientProxy.java (original)
+++ cxf/trunk/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/JaxWsClientProxy.java Tue Feb  3 09:26:05 2009
@@ -223,32 +223,65 @@
 
         client.setExecutor(getClient().getEndpoint().getExecutor());
         
-        final AsyncHandler<Object> handler;
+        AsyncHandler<Object> handler;
         if (params.length > 0 && params[params.length - 1] instanceof AsyncHandler) {
             handler = (AsyncHandler)params[params.length - 1];
         } else {
             handler = null;
         }
-        
-        final ClientCallback callback = new ClientCallback() {
-            boolean handlerCalled;
-            public void handleResponse(Map<String, Object> ctx, Object[] res) {
-                super.handleResponse(ctx, res);
-                if (handler != null) {
-                    handler.handleResponse(new ResponseCallback(this));
-                }
-                handlerCalled = true;
-            }
-            public boolean isDone() {
-                return handlerCalled && super.isDone();
-            }
-        };
-        
+        ClientCallback callback = new JaxwsClientCallback(handler);
+             
         Response<Object> ret = new ResponseCallback(callback);
         client.invoke(callback, oi, params);
         return ret;
     }
 
+    static class JaxwsClientCallback extends ClientCallback {
+        final AsyncHandler<Object> handler;
+        
+        public JaxwsClientCallback(final AsyncHandler<Object> handler) {
+            this.handler = handler;
+        }
+        public void handleResponse(Map<String, Object> ctx, Object[] res) {
+            context = ctx;
+            result = res;
+            if (handler != null) {
+                handler.handleResponse(new Response<Object>() {
+
+                    public Map<String, Object> getContext() {
+                        return context;
+                    }
+
+                    public boolean cancel(boolean mayInterruptIfRunning) {
+                        cancelled = true;
+                        return true;
+                    }
+
+                    public Object get() throws InterruptedException, ExecutionException {
+                        return result[0];
+                    }
+
+                    public Object get(long timeout, TimeUnit unit) throws InterruptedException,
+                        ExecutionException, TimeoutException {
+                        return result[0];
+                    }
+
+                    public boolean isCancelled() {
+                        return cancelled;
+                    }
+
+                    public boolean isDone() {
+                        return true;
+                    }
+                    
+                });
+            }
+            done = true;
+            synchronized (this) {
+                notifyAll();
+            }
+        }
+    }
     static class ResponseCallback implements Response<Object> {
         ClientCallback callback;
         public ResponseCallback(ClientCallback cb) {

Modified: cxf/trunk/systests/src/test/java/org/apache/cxf/systest/jaxws/ClientServerTest.java
URL: http://svn.apache.org/viewvc/cxf/trunk/systests/src/test/java/org/apache/cxf/systest/jaxws/ClientServerTest.java?rev=740255&r1=740254&r2=740255&view=diff
==============================================================================
--- cxf/trunk/systests/src/test/java/org/apache/cxf/systest/jaxws/ClientServerTest.java (original)
+++ cxf/trunk/systests/src/test/java/org/apache/cxf/systest/jaxws/ClientServerTest.java Tue Feb  3 09:26:05 2009
@@ -580,6 +580,7 @@
                             Thread.sleep(100);
                         } catch (InterruptedException ex) {
                             // ignore
+                            ex.printStackTrace();
                         }
                     }
                 }