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/05 16:08:27 UTC

svn commit: r741124 - in /cxf/trunk/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws: AsyncCallbackFuture.java DispatchAsyncCallable.java DispatchImpl.java

Author: dkulp
Date: Thu Feb  5 15:08:26 2009
New Revision: 741124

URL: http://svn.apache.org/viewvc?rev=741124&view=rev
Log:
Fix race condition in async dispatch client where isDone could return true even if the response wasn't actually done.

Removed:
    cxf/trunk/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/AsyncCallbackFuture.java
Modified:
    cxf/trunk/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/DispatchAsyncCallable.java
    cxf/trunk/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/DispatchImpl.java

Modified: cxf/trunk/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/DispatchAsyncCallable.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/DispatchAsyncCallable.java?rev=741124&r1=741123&r2=741124&view=diff
==============================================================================
--- cxf/trunk/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/DispatchAsyncCallable.java (original)
+++ cxf/trunk/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/DispatchAsyncCallable.java Thu Feb  5 15:08:26 2009
@@ -19,20 +19,58 @@
 
 package org.apache.cxf.jaxws;
 
+import java.util.Map;
 import java.util.concurrent.Callable;
+import java.util.concurrent.TimeUnit;
 
+import javax.xml.ws.AsyncHandler;
 import javax.xml.ws.Dispatch;
+import javax.xml.ws.Response;
 
 public class DispatchAsyncCallable<T> implements Callable<T> {
     private Dispatch<T> dispatch;
     private T object;
-    public DispatchAsyncCallable(Dispatch<T> disp, T obj) {
+    private AsyncHandler callback;
+    
+    public DispatchAsyncCallable(Dispatch<T> disp, T obj, AsyncHandler c) {
         dispatch = disp;
         object = obj;
+        callback = c;
     }
 
+    @SuppressWarnings("unchecked")
     public T call() throws Exception {
-        return dispatch.invoke(object);
+        final T result = dispatch.invoke(object);
+        if (callback != null) {
+            callback.handleResponse(new Response<Object>() {
+
+                public Map<String, Object> getContext() {
+                    return dispatch.getResponseContext();
+                }
+
+                public boolean cancel(boolean mayInterruptIfRunning) {
+                    return false;
+                }
+
+                public Object get() {
+                    return result;
+                }
+
+                public boolean isCancelled() {
+                    return false;
+                }
+
+                public boolean isDone() {
+                    return true;
+                }
+
+                public Object get(long timeout, TimeUnit unit) {
+                    return result;
+                }
+                
+            });
+        }
+        return result;
     }
 
 }

Modified: cxf/trunk/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/DispatchImpl.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/DispatchImpl.java?rev=741124&r1=741123&r2=741124&view=diff
==============================================================================
--- cxf/trunk/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/DispatchImpl.java (original)
+++ cxf/trunk/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/DispatchImpl.java Thu Feb  5 15:08:26 2009
@@ -356,16 +356,14 @@
     }
 
     public Future<?> invokeAsync(T obj, AsyncHandler<T> asyncHandler) {
+        FutureTask<T> f = new FutureTask<T>(new DispatchAsyncCallable<T>(this, obj, asyncHandler));
+        getExecutor().execute(f);
         
-        Response<?> r = invokeAsync(obj);
-        AsyncCallbackFuture callback = new AsyncCallbackFuture(r, asyncHandler);
-
-        getExecutor().execute(callback);
-        return callback;
+        return f;
     }
 
     public Response<T> invokeAsync(T obj) {
-        FutureTask<T> f = new FutureTask<T>(new DispatchAsyncCallable<T>(this, obj));
+        FutureTask<T> f = new FutureTask<T>(new DispatchAsyncCallable<T>(this, obj, null));
 
         getExecutor().execute(f);
         return new AsyncResponse<T>(f, cl);