[jbossws-commits] JBossWS SVN: r12929 - in stack/native/trunk/modules: core/src/main/java/org/jboss/ws/core/jaxws/spi and 1 other directories.

jbossws-commits at lists.jboss.org jbossws-commits at lists.jboss.org
Wed Sep 8 05:56:24 EDT 2010


Author: darran.lofthouse at jboss.com
Date: 2010-09-08 05:56:23 -0400 (Wed, 08 Sep 2010)
New Revision: 12929

Modified:
   stack/native/trunk/modules/core/src/main/java/org/jboss/ws/core/jaxws/client/ClientProxy.java
   stack/native/trunk/modules/core/src/main/java/org/jboss/ws/core/jaxws/client/ResponseImpl.java
   stack/native/trunk/modules/core/src/main/java/org/jboss/ws/core/jaxws/spi/ServiceDelegateImpl.java
   stack/native/trunk/modules/testsuite/native-tests/src/test/java/org/jboss/test/ws/jaxws/jbws3071/JBWS3071TestCase.java
   stack/native/trunk/modules/testsuite/native-tests/src/test/java/org/jboss/test/ws/jaxws/jbws3071/StringHandler.java
   stack/native/trunk/modules/testsuite/native-tests/src/test/java/org/jboss/test/ws/jaxws/jbws3071/TestEndpointImpl.java
Log:
[JBWS-3071] JAX-WS Asynchronous Exception handling.

Modified: stack/native/trunk/modules/core/src/main/java/org/jboss/ws/core/jaxws/client/ClientProxy.java
===================================================================
--- stack/native/trunk/modules/core/src/main/java/org/jboss/ws/core/jaxws/client/ClientProxy.java	2010-09-08 09:55:39 UTC (rev 12928)
+++ stack/native/trunk/modules/core/src/main/java/org/jboss/ws/core/jaxws/client/ClientProxy.java	2010-09-08 09:56:23 UTC (rev 12929)
@@ -275,15 +275,15 @@
                log.debug("Finished task " + getTaskID().toString() + ": " + result);
 
             response.set(result);
-
-            // Call the handler if available
-            if (handler != null)
-               handler.handleResponse(response);
          }
          catch (Exception ex)
          {
             handleAsynInvokeException(ex);
          }
+         
+         // Call the handler if available
+         if (handler != null)
+            handler.handleResponse(response);
       }
 
       // 2.3.4.5 Conformance (Asychronous fault cause): An ExecutionException that is thrown by the get method

Modified: stack/native/trunk/modules/core/src/main/java/org/jboss/ws/core/jaxws/client/ResponseImpl.java
===================================================================
--- stack/native/trunk/modules/core/src/main/java/org/jboss/ws/core/jaxws/client/ResponseImpl.java	2010-09-08 09:55:39 UTC (rev 12928)
+++ stack/native/trunk/modules/core/src/main/java/org/jboss/ws/core/jaxws/client/ResponseImpl.java	2010-09-08 09:56:23 UTC (rev 12929)
@@ -45,7 +45,6 @@
    private Exception exception;
    private Map<String, Object> context = new HashMap<String, Object>();
 
-
    public void setException(Exception ex)
    {
       this.exception = ex;
@@ -67,16 +66,16 @@
             throw new WebServiceException(exception);
          }
       }
-      
+
       return delegate;
    }
-   
+
    private Future getFutureInternal()
    {
       if (delegate == null)
-         throw new IllegalStateException("Future not available");      
-      
-      return delegate;      
+         throw new IllegalStateException("Future not available");
+
+      return delegate;
    }
 
    public void setFuture(Future delegate)
@@ -93,7 +92,7 @@
    {
       this.result = result;
    }
-   
+
    public boolean cancel(boolean mayInterruptIfRunning)
    {
       return getFutureInternal().cancel(mayInterruptIfRunning);
@@ -101,24 +100,34 @@
 
    public Object get() throws InterruptedException, ExecutionException
    {
-      if (result == null)
+      Object response = getResult();
+      if (response != null)
       {
-         getFutureInternal().get();
+         return response;
       }
-      
-      if (exception != null)
-         throw new ExecutionException(exception);
 
-      return result;
+      getFutureInternal().get();
+      response = getResult();
+
+      return response;
    }
 
    public Object get(long timeout, TimeUnit unit) throws InterruptedException, ExecutionException, TimeoutException
    {
-      if (result == null)
+      Object response = getResult();
+      if (response != null)
       {
-         getFutureInternal().get(timeout, unit);
+         return response;
       }
 
+      getFutureInternal().get(timeout, unit);
+      response = getResult();
+
+      return response;
+   }
+
+   private Object getResult() throws ExecutionException
+   {
       if (exception != null)
          throw new ExecutionException(exception);
 

Modified: stack/native/trunk/modules/core/src/main/java/org/jboss/ws/core/jaxws/spi/ServiceDelegateImpl.java
===================================================================
--- stack/native/trunk/modules/core/src/main/java/org/jboss/ws/core/jaxws/spi/ServiceDelegateImpl.java	2010-09-08 09:55:39 UTC (rev 12928)
+++ stack/native/trunk/modules/core/src/main/java/org/jboss/ws/core/jaxws/spi/ServiceDelegateImpl.java	2010-09-08 09:56:23 UTC (rev 12929)
@@ -101,8 +101,11 @@
    // provide logging
    private static final Logger log = Logger.getLogger(ServiceDelegateImpl.class);
 
+   // Lock to ensure only one thread can initialise the defaultExecutor.
+   private static final Object DEFAULT_EXECUTOR_LOCK = new Object();
    // The executor service
-   private static ExecutorService defaultExecutor = Executors.newCachedThreadPool();
+   private static ExecutorService defaultExecutor = null;
+         
    // The service meta data that is associated with this JAXWS Service
    private ServiceMetaData serviceMetaData;
    // The ServiceRefMetaData supplied by the ServiceObjectFactory 
@@ -340,12 +343,32 @@
       this.handlerResolver = handlerResolver;
    }
 
+   private ExecutorService getDefaultExecutor()
+   {
+      if (defaultExecutor == null)
+      {
+         synchronized (DEFAULT_EXECUTOR_LOCK)
+         {
+            if (defaultExecutor == null)
+            {
+               defaultExecutor = Executors.newCachedThreadPool();
+               if (log.isTraceEnabled())
+               {
+                  log.trace("Created new defaultExecutor", new Throwable("Call Trace"));
+               }
+            }
+         }
+      }
+
+      return defaultExecutor;
+   }
+   
    @Override
    public Executor getExecutor()
    {
       if (executor == null)
       {
-         executor = defaultExecutor;
+         executor = getDefaultExecutor();
       }
       return executor;
    }

Modified: stack/native/trunk/modules/testsuite/native-tests/src/test/java/org/jboss/test/ws/jaxws/jbws3071/JBWS3071TestCase.java
===================================================================
--- stack/native/trunk/modules/testsuite/native-tests/src/test/java/org/jboss/test/ws/jaxws/jbws3071/JBWS3071TestCase.java	2010-09-08 09:55:39 UTC (rev 12928)
+++ stack/native/trunk/modules/testsuite/native-tests/src/test/java/org/jboss/test/ws/jaxws/jbws3071/JBWS3071TestCase.java	2010-09-08 09:56:23 UTC (rev 12929)
@@ -130,4 +130,26 @@
       }
    }
 
+   public void testEchoFailAsyncFuture_isDone() throws Exception
+   {
+      StringHandler handler = new StringHandler();
+      
+      Future future = port.echoAsync("FAIL SLEEP", handler);      
+      while (future.isDone() == false)
+      {
+         Thread.sleep(200);
+      }
+                  
+      try
+      {
+         handler.getResponse().get();
+         fail("Expected 'ExecutionException' not thrown.");
+      }
+      catch (ExecutionException ee)
+      {
+         Exception cause = (Exception)ee.getCause();
+         assertEquals("Cause Type", TestException.class, cause.getClass());
+      }
+   }
+   
 }

Modified: stack/native/trunk/modules/testsuite/native-tests/src/test/java/org/jboss/test/ws/jaxws/jbws3071/StringHandler.java
===================================================================
--- stack/native/trunk/modules/testsuite/native-tests/src/test/java/org/jboss/test/ws/jaxws/jbws3071/StringHandler.java	2010-09-08 09:55:39 UTC (rev 12928)
+++ stack/native/trunk/modules/testsuite/native-tests/src/test/java/org/jboss/test/ws/jaxws/jbws3071/StringHandler.java	2010-09-08 09:56:23 UTC (rev 12929)
@@ -21,6 +21,10 @@
 */
 package org.jboss.test.ws.jaxws.jbws3071;
 
+import java.util.concurrent.ExecutionException;
+
+import org.jboss.logging.Logger;
+
 import javax.xml.ws.AsyncHandler;
 import javax.xml.ws.Response;
 
@@ -30,12 +34,27 @@
  */
 public class StringHandler implements AsyncHandler<String>
 {
+   private static final Logger log = Logger.getLogger(StringHandler.class);
 
    private Response<String> response;
 
    @Override
    public void handleResponse(Response<String> res)
    {
+      try
+      {
+         Object response = res.get();
+         log.debug("Obtained Response - " + response.toString());
+      }
+      catch (InterruptedException e)
+      {
+         log.debug("Caught InterruptedException", e);
+      }
+      catch (ExecutionException e)
+      {
+         log.debug("Caught ExecutionException", e);
+
+      }
       this.response = res;
    }
 

Modified: stack/native/trunk/modules/testsuite/native-tests/src/test/java/org/jboss/test/ws/jaxws/jbws3071/TestEndpointImpl.java
===================================================================
--- stack/native/trunk/modules/testsuite/native-tests/src/test/java/org/jboss/test/ws/jaxws/jbws3071/TestEndpointImpl.java	2010-09-08 09:55:39 UTC (rev 12928)
+++ stack/native/trunk/modules/testsuite/native-tests/src/test/java/org/jboss/test/ws/jaxws/jbws3071/TestEndpointImpl.java	2010-09-08 09:56:23 UTC (rev 12929)
@@ -34,8 +34,20 @@
 
    public String echo(String message) throws TestException
    {
-      if ("FAIL".equals(message))
+      if (message.contains("SLEEP"))
       {
+         try
+         {
+            Thread.sleep(5000);
+         }
+         catch (InterruptedException e)
+         {
+            throw new RuntimeException("Unable to sleep", e);
+         }
+      }
+
+      if (message.contains("FAIL"))
+      {
          throw new TestException(message);
       }
 



More information about the jbossws-commits mailing list