You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cxf.apache.org by se...@apache.org on 2013/02/08 17:37:05 UTC

svn commit: r1444117 - in /cxf/trunk: rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/ rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/impl/ rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/interceptor/ rt/transports/http-jetty/src/main/j...

Author: sergeyb
Date: Fri Feb  8 16:37:04 2013
New Revision: 1444117

URL: http://svn.apache.org/r1444117
Log:
[CXF-4817] Making sure async CompletionCallback is called

Modified:
    cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/JAXRSInvoker.java
    cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/impl/AsyncResponseImpl.java
    cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/interceptor/JAXRSOutInterceptor.java
    cxf/trunk/rt/transports/http-jetty/src/main/java/org/apache/cxf/transport/http_jetty/continuations/JettyContinuationWrapper.java
    cxf/trunk/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/AbstractJAXRSContinuationsTest.java
    cxf/trunk/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/BookContinuationStore.java

Modified: cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/JAXRSInvoker.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/JAXRSInvoker.java?rev=1444117&r1=1444116&r2=1444117&view=diff
==============================================================================
--- cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/JAXRSInvoker.java (original)
+++ cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/JAXRSInvoker.java Fri Feb  8 16:37:04 2013
@@ -85,7 +85,7 @@ public class JAXRSInvoker extends Abstra
                 AsyncResponseImpl asyncImpl = (AsyncResponseImpl)asyncResp;
                 asyncImpl.prepareContinuation();
                 asyncImpl.handleTimeout();
-                return handleAsyncResponse(exchange, asyncImpl.getResponseObject());
+                return handleAsyncResponse(exchange, asyncImpl);
             }
         }
         if (response != null) {
@@ -118,10 +118,16 @@ public class JAXRSInvoker extends Abstra
         }
     }
 
-    private Object handleAsyncResponse(Exchange exchange, Object asyncObj) {
+    private Object handleAsyncResponse(Exchange exchange, AsyncResponseImpl ar) {
+        Object asyncObj = ar.getResponseObject();
         if (asyncObj instanceof Throwable) {
-            return handleFault(new Fault((Throwable)asyncObj), 
-                               exchange.getInMessage(), null, null);    
+            try {
+                return handleFault(new Fault((Throwable)asyncObj), 
+                                   exchange.getInMessage(), null, null);
+            } catch (Fault ex) {
+                ar.reset();
+                throw ex;
+            }
         } else {
             return new MessageContentsList(asyncObj);
         }
@@ -192,7 +198,7 @@ public class JAXRSInvoker extends Abstra
             }
             result = invoke(exchange, resourceObject, methodToInvoke, params);
             if (asyncResponse != null && !asyncResponse.suspendContinuationIfNeeded()) {
-                result = handleAsyncResponse(exchange, asyncResponse.getResponseObject());
+                result = handleAsyncResponse(exchange, asyncResponse);
             }
         } catch (Fault ex) {
             return handleFault(ex, inMessage, cri, methodToInvoke);

Modified: cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/impl/AsyncResponseImpl.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/impl/AsyncResponseImpl.java?rev=1444117&r1=1444116&r2=1444117&view=diff
==============================================================================
--- cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/impl/AsyncResponseImpl.java (original)
+++ cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/impl/AsyncResponseImpl.java Fri Feb  8 16:37:04 2013
@@ -247,5 +247,8 @@ public class AsyncResponseImpl implement
         initContinuation();
     }
     
+    public void reset() {
+        cont.reset();
+    }
     
 }

Modified: cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/interceptor/JAXRSOutInterceptor.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/interceptor/JAXRSOutInterceptor.java?rev=1444117&r1=1444116&r2=1444117&view=diff
==============================================================================
--- cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/interceptor/JAXRSOutInterceptor.java (original)
+++ cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/interceptor/JAXRSOutInterceptor.java Fri Feb  8 16:37:04 2013
@@ -53,6 +53,7 @@ import org.apache.cxf.common.util.ClassH
 import org.apache.cxf.interceptor.AbstractOutDatabindingInterceptor;
 import org.apache.cxf.io.CachedOutputStream;
 import org.apache.cxf.jaxrs.ext.ResponseHandler;
+import org.apache.cxf.jaxrs.impl.AsyncResponseImpl;
 import org.apache.cxf.jaxrs.impl.MetadataMap;
 import org.apache.cxf.jaxrs.impl.WriterInterceptorMBW;
 import org.apache.cxf.jaxrs.lifecycle.ResourceProvider;
@@ -102,6 +103,10 @@ public class JAXRSOutInterceptor extends
             if (cri != null) {
                 cri.clearThreadLocalProxies();
             }
+            AsyncResponse ar = (AsyncResponse)message.getExchange().get(AsyncResponse.class);
+            if (ar != null) {
+                ((AsyncResponseImpl)ar).reset();
+            }
         }
             
 

Modified: cxf/trunk/rt/transports/http-jetty/src/main/java/org/apache/cxf/transport/http_jetty/continuations/JettyContinuationWrapper.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/transports/http-jetty/src/main/java/org/apache/cxf/transport/http_jetty/continuations/JettyContinuationWrapper.java?rev=1444117&r1=1444116&r2=1444117&view=diff
==============================================================================
--- cxf/trunk/rt/transports/http-jetty/src/main/java/org/apache/cxf/transport/http_jetty/continuations/JettyContinuationWrapper.java (original)
+++ cxf/trunk/rt/transports/http-jetty/src/main/java/org/apache/cxf/transport/http_jetty/continuations/JettyContinuationWrapper.java Fri Feb  8 16:37:04 2013
@@ -81,7 +81,12 @@ public class JettyContinuationWrapper im
     }
 
     public void reset() {
-        continuation.complete();
+        try {
+            continuation.complete();
+        } catch (Throwable ex) {
+            // explicit complete call does not seem to work 
+            // with the non-Servlet3 Jetty Continuation
+        }
         obj = null;
         pendingTimeout = 0;
     }

Modified: cxf/trunk/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/AbstractJAXRSContinuationsTest.java
URL: http://svn.apache.org/viewvc/cxf/trunk/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/AbstractJAXRSContinuationsTest.java?rev=1444117&r1=1444116&r2=1444117&view=diff
==============================================================================
--- cxf/trunk/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/AbstractJAXRSContinuationsTest.java (original)
+++ cxf/trunk/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/AbstractJAXRSContinuationsTest.java Fri Feb  8 16:37:04 2013
@@ -58,6 +58,22 @@ public abstract class AbstractJAXRSConti
     }
     
     @Test
+    public void testGetBookNotFound() throws Exception {
+        WebClient wc = WebClient.create("http://localhost:" + getPort() + "/bookstore/books/notfound");
+        wc.accept("text/plain");
+        Response r = wc.get();
+        assertEquals(404, r.getStatus());
+    }
+    
+    @Test
+    public void testGetBookNotFoundUnmapped() throws Exception {
+        WebClient wc = WebClient.create("http://localhost:" + getPort() + "/bookstore/books/notfound/unmapped");
+        wc.accept("text/plain");
+        Response r = wc.get();
+        assertEquals(500, r.getStatus());
+    }
+    
+    @Test
     public void testTimeoutAndCancel() throws Exception {
         WebClient wc = WebClient.create("http://localhost:" + getPort() + "/bookstore/books/cancel");
         WebClient.getConfig(wc).getHttpConduit().getClient().setReceiveTimeout(1000000L);

Modified: cxf/trunk/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/BookContinuationStore.java
URL: http://svn.apache.org/viewvc/cxf/trunk/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/BookContinuationStore.java?rev=1444117&r1=1444116&r2=1444117&view=diff
==============================================================================
--- cxf/trunk/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/BookContinuationStore.java (original)
+++ cxf/trunk/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/BookContinuationStore.java Fri Feb  8 16:37:04 2013
@@ -29,6 +29,7 @@ import java.util.concurrent.TimeUnit;
 import java.util.concurrent.atomic.AtomicInteger;
 
 import javax.ws.rs.GET;
+import javax.ws.rs.NotFoundException;
 import javax.ws.rs.Path;
 import javax.ws.rs.PathParam;
 import javax.ws.rs.Produces;
@@ -101,6 +102,21 @@ public class BookContinuationStore {
         resumeSuspended(id, response);
     }
     
+    @GET
+    @Path("books/notfound")
+    @Produces("text/plain")
+    public void handleContinuationRequestNotFound(AsyncResponse response) {
+        response.register(new CallbackImpl());
+        resumeSuspendedNotFound(response);
+    }
+    
+    @GET
+    @Path("books/notfound/unmapped")
+    @Produces("text/plain")
+    public void handleContinuationRequestNotFoundUnmapped(AsyncResponse response) {
+        response.register(new CallbackImpl());
+        resumeSuspendedNotFoundUnmapped(response);
+    }
     
     
     private void resumeSuspended(final String id, final AsyncResponse response) {
@@ -118,6 +134,35 @@ public class BookContinuationStore {
         
     }
     
+    private void resumeSuspendedNotFound(final AsyncResponse response) {
+        
+        executor.execute(new Runnable() {
+            public void run() {
+                try {
+                    Thread.sleep(2000);
+                } catch (InterruptedException ex) {
+                    // ignore
+                }       
+                response.resume(new NotFoundException());
+            }
+        });
+        
+    }
+    
+    private void resumeSuspendedNotFoundUnmapped(final AsyncResponse response) {
+        executor.execute(new Runnable() {
+            public void run() {
+                try {
+                    Thread.sleep(2000);
+                } catch (InterruptedException ex) {
+                    // ignore
+                }       
+                response.resume(new BookNotFoundFault(""));
+            }
+        });
+        
+    }
+    
     private void init() {
         books.put("1", "CXF in Action1");
         books.put("2", "CXF in Action2");
@@ -162,7 +207,6 @@ public class BookContinuationStore {
         @Override
         public void onComplete(Throwable throwable) {
             System.out.println("CompletionCallback: onComplete");
-            
         }
         
     }