Return-Path: Delivered-To: apmail-cxf-commits-archive@www.apache.org Received: (qmail 88970 invoked from network); 5 Feb 2009 15:08:49 -0000 Received: from hermes.apache.org (HELO mail.apache.org) (140.211.11.2) by minotaur.apache.org with SMTP; 5 Feb 2009 15:08:49 -0000 Received: (qmail 86336 invoked by uid 500); 5 Feb 2009 15:08:49 -0000 Delivered-To: apmail-cxf-commits-archive@cxf.apache.org Received: (qmail 86225 invoked by uid 500); 5 Feb 2009 15:08:48 -0000 Mailing-List: contact commits-help@cxf.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: dev@cxf.apache.org Delivered-To: mailing list commits@cxf.apache.org Received: (qmail 86206 invoked by uid 99); 5 Feb 2009 15:08:48 -0000 Received: from athena.apache.org (HELO athena.apache.org) (140.211.11.136) by apache.org (qpsmtpd/0.29) with ESMTP; Thu, 05 Feb 2009 07:08:48 -0800 X-ASF-Spam-Status: No, hits=-2000.0 required=10.0 tests=ALL_TRUSTED X-Spam-Check-By: apache.org Received: from [140.211.11.4] (HELO eris.apache.org) (140.211.11.4) by apache.org (qpsmtpd/0.29) with ESMTP; Thu, 05 Feb 2009 15:08:47 +0000 Received: by eris.apache.org (Postfix, from userid 65534) id 596102388892; Thu, 5 Feb 2009 15:08:27 +0000 (UTC) Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: svn commit: r741124 - in /cxf/trunk/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws: AsyncCallbackFuture.java DispatchAsyncCallable.java DispatchImpl.java Date: Thu, 05 Feb 2009 15:08:27 -0000 To: commits@cxf.apache.org From: dkulp@apache.org X-Mailer: svnmailer-1.0.8 Message-Id: <20090205150827.596102388892@eris.apache.org> X-Virus-Checked: Checked by ClamAV on apache.org 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 implements Callable { private Dispatch dispatch; private T object; - public DispatchAsyncCallable(Dispatch disp, T obj) { + private AsyncHandler callback; + + public DispatchAsyncCallable(Dispatch 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() { + + public Map 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 asyncHandler) { + FutureTask f = new FutureTask(new DispatchAsyncCallable(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 invokeAsync(T obj) { - FutureTask f = new FutureTask(new DispatchAsyncCallable(this, obj)); + FutureTask f = new FutureTask(new DispatchAsyncCallable(this, obj, null)); getExecutor().execute(f); return new AsyncResponse(f, cl);