cxf-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From serg...@apache.org
Subject svn commit: r1543203 - in /cxf/branches/2.7.x-fixes: ./ api/src/main/java/org/apache/cxf/interceptor/ api/src/main/java/org/apache/cxf/message/ rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/ rt/transports/http-jetty/src/main/java/org/apache/cxf/...
Date Mon, 18 Nov 2013 22:32:12 GMT
Author: sergeyb
Date: Mon Nov 18 22:32:11 2013
New Revision: 1543203

URL: http://svn.apache.org/r1543203
Log:
Merged revisions 1541532 via svnmerge from 
https://svn.apache.org/repos/asf/cxf/trunk

........
  r1541532 | sergeyb | 2013-11-13 14:21:44 +0000 (Wed, 13 Nov 2013) | 1 line
  
  [CXF-5373] Suspending continuations does not work if the current thread is different to
the one which holds PhaseInterceptorChain lock
........

Modified:
    cxf/branches/2.7.x-fixes/   (props changed)
    cxf/branches/2.7.x-fixes/api/src/main/java/org/apache/cxf/interceptor/ServiceInvokerInterceptor.java
    cxf/branches/2.7.x-fixes/api/src/main/java/org/apache/cxf/message/Message.java
    cxf/branches/2.7.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/JAXRSInvoker.java
    cxf/branches/2.7.x-fixes/rt/transports/http-jetty/src/main/java/org/apache/cxf/transport/http_jetty/continuations/JettyContinuationWrapper.java
    cxf/branches/2.7.x-fixes/rt/transports/http/src/main/java/org/apache/cxf/transport/http/Servlet3ContinuationProvider.java
    cxf/branches/2.7.x-fixes/rt/transports/jms/src/main/java/org/apache/cxf/transport/jms/continuations/JMSContinuation.java
    cxf/branches/2.7.x-fixes/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/AbstractJAXRSContinuationsTest.java
    cxf/branches/2.7.x-fixes/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/JAXRSContinuationsServlet3Test.java
    cxf/branches/2.7.x-fixes/systests/jaxrs/src/test/resources/jaxrs_async/WEB-INF/beans.xml

Propchange: cxf/branches/2.7.x-fixes/
------------------------------------------------------------------------------
  Merged /cxf/trunk:r1541532

Propchange: cxf/branches/2.7.x-fixes/
------------------------------------------------------------------------------
Binary property 'svnmerge-blocked' - no diff available.

Propchange: cxf/branches/2.7.x-fixes/
------------------------------------------------------------------------------
Binary property 'svnmerge-integrated' - no diff available.

Modified: cxf/branches/2.7.x-fixes/api/src/main/java/org/apache/cxf/interceptor/ServiceInvokerInterceptor.java
URL: http://svn.apache.org/viewvc/cxf/branches/2.7.x-fixes/api/src/main/java/org/apache/cxf/interceptor/ServiceInvokerInterceptor.java?rev=1543203&r1=1543202&r2=1543203&view=diff
==============================================================================
--- cxf/branches/2.7.x-fixes/api/src/main/java/org/apache/cxf/interceptor/ServiceInvokerInterceptor.java
(original)
+++ cxf/branches/2.7.x-fixes/api/src/main/java/org/apache/cxf/interceptor/ServiceInvokerInterceptor.java
Mon Nov 18 22:32:11 2013
@@ -24,6 +24,7 @@ import java.util.concurrent.ExecutionExc
 import java.util.concurrent.Executor;
 import java.util.concurrent.FutureTask;
 
+import org.apache.cxf.common.util.PropertyUtils;
 import org.apache.cxf.endpoint.Endpoint;
 import org.apache.cxf.message.Exchange;
 import org.apache.cxf.message.Message;
@@ -121,7 +122,12 @@ public class ServiceInvokerInterceptor e
                     } else {
                         throw new Fault(e.getCause());
                     }
+                } finally {
+                    if (PropertyUtils.isTrue(exchange.remove(Message.SUSPENDED_INVOCATION)))
{    
+                        message.getInterceptorChain().suspend();
+                    }
                 }
+                
             }
         }
     }

Modified: cxf/branches/2.7.x-fixes/api/src/main/java/org/apache/cxf/message/Message.java
URL: http://svn.apache.org/viewvc/cxf/branches/2.7.x-fixes/api/src/main/java/org/apache/cxf/message/Message.java?rev=1543203&r1=1543202&r2=1543203&view=diff
==============================================================================
--- cxf/branches/2.7.x-fixes/api/src/main/java/org/apache/cxf/message/Message.java (original)
+++ cxf/branches/2.7.x-fixes/api/src/main/java/org/apache/cxf/message/Message.java Mon Nov
18 22:32:11 2013
@@ -139,6 +139,7 @@ public interface Message extends StringM
     String WSDL_INTERFACE = "javax.xml.ws.wsdl.interface";
     String WSDL_OPERATION = "javax.xml.ws.wsdl.operation";
 
+    String SUSPENDED_INVOCATION = "org.apache.cxf.suspended.invocation";
     /**
      * Some properties to allow adding interceptors to the chain
      * on a per-request basis.  All are a Collection<Interceptor> 

Modified: cxf/branches/2.7.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/JAXRSInvoker.java
URL: http://svn.apache.org/viewvc/cxf/branches/2.7.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/JAXRSInvoker.java?rev=1543203&r1=1543202&r2=1543203&view=diff
==============================================================================
--- cxf/branches/2.7.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/JAXRSInvoker.java
(original)
+++ cxf/branches/2.7.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/JAXRSInvoker.java
Mon Nov 18 22:32:11 2013
@@ -43,6 +43,7 @@ import org.apache.cxf.common.classloader
 import org.apache.cxf.common.i18n.BundleUtils;
 import org.apache.cxf.common.logging.LogUtils;
 import org.apache.cxf.common.util.ClassHelper;
+import org.apache.cxf.common.util.PropertyUtils;
 import org.apache.cxf.helpers.CastUtils;
 import org.apache.cxf.interceptor.Fault;
 import org.apache.cxf.interceptor.InterceptorChain.State;
@@ -106,7 +107,8 @@ public class JAXRSInvoker extends Abstra
             }
             return handleFault(ex, exchange.getInMessage());
         } finally {
-            boolean suspended = exchange.getInMessage().getInterceptorChain().getState()
== State.SUSPENDED;
+            boolean suspended = PropertyUtils.isTrue(exchange.get(Message.SUSPENDED_INVOCATION))
+                || exchange.getInMessage().getInterceptorChain().getState() == State.SUSPENDED;
             if (exchange.isOneWay() || suspended) {
                 ProviderFactory.getInstance(exchange.getInMessage()).clearThreadLocalProxies();
             }

Modified: cxf/branches/2.7.x-fixes/rt/transports/http-jetty/src/main/java/org/apache/cxf/transport/http_jetty/continuations/JettyContinuationWrapper.java
URL: http://svn.apache.org/viewvc/cxf/branches/2.7.x-fixes/rt/transports/http-jetty/src/main/java/org/apache/cxf/transport/http_jetty/continuations/JettyContinuationWrapper.java?rev=1543203&r1=1543202&r2=1543203&view=diff
==============================================================================
--- cxf/branches/2.7.x-fixes/rt/transports/http-jetty/src/main/java/org/apache/cxf/transport/http_jetty/continuations/JettyContinuationWrapper.java
(original)
+++ cxf/branches/2.7.x-fixes/rt/transports/http-jetty/src/main/java/org/apache/cxf/transport/http_jetty/continuations/JettyContinuationWrapper.java
Mon Nov 18 22:32:11 2013
@@ -25,6 +25,7 @@ import javax.servlet.http.HttpServletRes
 import org.apache.cxf.continuations.Continuation;
 import org.apache.cxf.continuations.ContinuationCallback;
 import org.apache.cxf.message.Message;
+import org.apache.cxf.phase.PhaseInterceptorChain;
 import org.apache.cxf.transport.http.AbstractHTTPDestination;
 import org.eclipse.jetty.continuation.ContinuationListener;
 import org.eclipse.jetty.continuation.ContinuationSupport;
@@ -100,8 +101,13 @@ public class JettyContinuationWrapper im
         }
         isNew = false;
         
-        // Need to get the right message which is handled in the interceptor chain
-        message.getExchange().getInMessage().getInterceptorChain().suspend();
+        if (PhaseInterceptorChain.getCurrentMessage() == null) {
+            // the current thread is different to the one which holds a lock on PhaseInterceptorChain

+            message.getExchange().put(Message.SUSPENDED_INVOCATION, true);
+        } else {
+            // Need to get the right message which is handled in the interceptor chain
+            message.getExchange().getInMessage().getInterceptorChain().suspend();
+        }
         continuation.setTimeout(pendingTimeout);
         if (!isPending) {
             continuation.suspend();

Modified: cxf/branches/2.7.x-fixes/rt/transports/http/src/main/java/org/apache/cxf/transport/http/Servlet3ContinuationProvider.java
URL: http://svn.apache.org/viewvc/cxf/branches/2.7.x-fixes/rt/transports/http/src/main/java/org/apache/cxf/transport/http/Servlet3ContinuationProvider.java?rev=1543203&r1=1543202&r2=1543203&view=diff
==============================================================================
--- cxf/branches/2.7.x-fixes/rt/transports/http/src/main/java/org/apache/cxf/transport/http/Servlet3ContinuationProvider.java
(original)
+++ cxf/branches/2.7.x-fixes/rt/transports/http/src/main/java/org/apache/cxf/transport/http/Servlet3ContinuationProvider.java
Mon Nov 18 22:32:11 2013
@@ -31,6 +31,7 @@ import org.apache.cxf.continuations.Cont
 import org.apache.cxf.continuations.ContinuationCallback;
 import org.apache.cxf.continuations.ContinuationProvider;
 import org.apache.cxf.message.Message;
+import org.apache.cxf.phase.PhaseInterceptorChain;
 
 /**
  * 
@@ -98,9 +99,14 @@ public class Servlet3ContinuationProvide
             }
             isNew = false;
             
-            // Need to get the right message which is handled in the interceptor chain
             context.setTimeout(timeout);
-            inMessage.getExchange().getInMessage().getInterceptorChain().suspend();
+            if (PhaseInterceptorChain.getCurrentMessage() == null) {
+                // the current thread is different to the one which holds a lock on PhaseInterceptorChain

+                inMessage.getExchange().put(Message.SUSPENDED_INVOCATION, true);
+            } else {
+                // Need to get the right message which is handled in the interceptor chain
+                inMessage.getExchange().getInMessage().getInterceptorChain().suspend();
+            }
             
             return true;
         }

Modified: cxf/branches/2.7.x-fixes/rt/transports/jms/src/main/java/org/apache/cxf/transport/jms/continuations/JMSContinuation.java
URL: http://svn.apache.org/viewvc/cxf/branches/2.7.x-fixes/rt/transports/jms/src/main/java/org/apache/cxf/transport/jms/continuations/JMSContinuation.java?rev=1543203&r1=1543202&r2=1543203&view=diff
==============================================================================
--- cxf/branches/2.7.x-fixes/rt/transports/jms/src/main/java/org/apache/cxf/transport/jms/continuations/JMSContinuation.java
(original)
+++ cxf/branches/2.7.x-fixes/rt/transports/jms/src/main/java/org/apache/cxf/transport/jms/continuations/JMSContinuation.java
Mon Nov 18 22:32:11 2013
@@ -29,6 +29,7 @@ import org.apache.cxf.common.classloader
 import org.apache.cxf.common.logging.LogUtils;
 import org.apache.cxf.continuations.Continuation;
 import org.apache.cxf.message.Message;
+import org.apache.cxf.phase.PhaseInterceptorChain;
 import org.apache.cxf.transport.MessageObserver;
 import org.apache.cxf.transport.jms.JMSConfiguration;
 import org.apache.cxf.workqueue.WorkQueue;
@@ -138,8 +139,13 @@ public class JMSContinuation implements 
         if (isPending) {
             return false;
         }
-        // Need to get the right message which is handled in the interceptor chain
-        inMessage.getExchange().getInMessage().getInterceptorChain().suspend();
+        if (PhaseInterceptorChain.getCurrentMessage() == null) {
+            // the current thread is different to the one which holds a lock on PhaseInterceptorChain

+            inMessage.getExchange().put(Message.SUSPENDED_INVOCATION, true);
+        } else {
+            // Need to get the right message which is handled in the interceptor chain
+            inMessage.getExchange().getInMessage().getInterceptorChain().suspend();
+        }
         updateContinuations(false);
                 
         isNew = false;

Modified: cxf/branches/2.7.x-fixes/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/AbstractJAXRSContinuationsTest.java
URL: http://svn.apache.org/viewvc/cxf/branches/2.7.x-fixes/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/AbstractJAXRSContinuationsTest.java?rev=1543203&r1=1543202&r2=1543203&view=diff
==============================================================================
--- cxf/branches/2.7.x-fixes/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/AbstractJAXRSContinuationsTest.java
(original)
+++ cxf/branches/2.7.x-fixes/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/AbstractJAXRSContinuationsTest.java
Mon Nov 18 22:32:11 2013
@@ -43,7 +43,7 @@ public abstract class AbstractJAXRSConti
     
     @Test
     public void testDefaultTimeout() throws Exception {
-        WebClient wc = WebClient.create("http://localhost:" + getPort() + "/bookstore/books/defaulttimeout");
+        WebClient wc = WebClient.create("http://localhost:" + getPort() + getBaseAddress()
+ "/books/defaulttimeout");
         WebClient.getConfig(wc).getHttpConduit().getClient().setReceiveTimeout(1000000L);
         Response r = wc.get();
         assertEquals(503, r.getStatus());
@@ -51,7 +51,7 @@ public abstract class AbstractJAXRSConti
     
     @Test
     public void testImmediateResume() throws Exception {
-        WebClient wc = WebClient.create("http://localhost:" + getPort() + "/bookstore/books/resume");
+        WebClient wc = WebClient.create("http://localhost:" + getPort() + getBaseAddress()
+ "/books/resume");
         WebClient.getConfig(wc).getHttpConduit().getClient().setReceiveTimeout(1000000L);
         wc.accept("text/plain");
         String str = wc.get(String.class);
@@ -61,7 +61,7 @@ public abstract class AbstractJAXRSConti
     @Test
     public void testImmediateResumeSubresource() throws Exception {
         WebClient wc = WebClient.create("http://localhost:" + getPort() 
-                                        + "/bookstore/books/subresources/books/resume");
+                                        + getBaseAddress() + "/books/subresources/books/resume");
         WebClient.getConfig(wc).getHttpConduit().getClient().setReceiveTimeout(1000000L);
         wc.accept("text/plain");
         String str = wc.get(String.class);
@@ -70,7 +70,11 @@ public abstract class AbstractJAXRSConti
     
     @Test
     public void testTimeoutAndCancel() throws Exception {
-        WebClient wc = WebClient.create("http://localhost:" + getPort() + "/bookstore/books/cancel");
+        doTestTimeoutAndCancel(getBaseAddress());
+    }
+    
+    protected void doTestTimeoutAndCancel(String baseAddress) throws Exception {
+        WebClient wc = WebClient.create("http://localhost:" + getPort() + baseAddress + "/books/cancel");
         WebClient.getConfig(wc).getHttpConduit().getClient().setReceiveTimeout(1000000L);
         Response r = wc.get();
         assertEquals(503, r.getStatus());
@@ -82,25 +86,25 @@ public abstract class AbstractJAXRSConti
     @Test
     public void testContinuationWithTimeHandler() throws Exception {
         
-        doTestContinuation("books/timeouthandler");
+        doTestContinuation("/books/timeouthandler");
     }
     
     @Test
     public void testContinuationWithTimeHandlerResumeOnly() throws Exception {
         
-        doTestContinuation("books/timeouthandlerresume");
+        doTestContinuation("/books/timeouthandlerresume");
     }
     
     @Test
     public void testContinuation() throws Exception {
         
-        doTestContinuation("books");
+        doTestContinuation("/books");
     }
     
     @Test
     public void testContinuationSubresource() throws Exception {
         
-        doTestContinuation("books/subresources");
+        doTestContinuation("/books/subresources");
     }
     
     protected void doTestContinuation(String pathSegment) throws Exception {
@@ -112,7 +116,7 @@ public abstract class AbstractJAXRSConti
         CountDownLatch doneSignal = new CountDownLatch(1);
         List<BookWorker> workers = new ArrayList<BookWorker>(5);
         for (int x = 1; x < 6; x++) {
-            workers.add(new BookWorker("http://localhost:" + port + "/bookstore/" + pathSegment
+ "/" + x, 
+            workers.add(new BookWorker("http://localhost:" + port + getBaseAddress() + pathSegment
+ "/" + x, 
                                        Integer.toString(x), 
                                        "CXF in Action" + x, startSignal, doneSignal));
         }
@@ -187,6 +191,10 @@ public abstract class AbstractJAXRSConti
         
     }
     
+    protected String getBaseAddress() {
+        return "/bookstore";
+    }
+    
     protected abstract String getPort();
     
 }

Modified: cxf/branches/2.7.x-fixes/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/JAXRSContinuationsServlet3Test.java
URL: http://svn.apache.org/viewvc/cxf/branches/2.7.x-fixes/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/JAXRSContinuationsServlet3Test.java?rev=1543203&r1=1543202&r2=1543203&view=diff
==============================================================================
--- cxf/branches/2.7.x-fixes/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/JAXRSContinuationsServlet3Test.java
(original)
+++ cxf/branches/2.7.x-fixes/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/JAXRSContinuationsServlet3Test.java
Mon Nov 18 22:32:11 2013
@@ -22,6 +22,7 @@ package org.apache.cxf.systest.jaxrs;
 import org.apache.cxf.jaxrs.model.AbstractResourceInfo;
 
 import org.junit.BeforeClass;
+import org.junit.Test;
 
 
 public class JAXRSContinuationsServlet3Test extends AbstractJAXRSContinuationsTest {
@@ -36,6 +37,15 @@ public class JAXRSContinuationsServlet3T
                    
     }
     
+    @Test
+    public void testTimeoutAndCancelAsyncExecutor() throws Exception {
+        doTestTimeoutAndCancel("/asyncexecutor/bookstore");
+    }
+    
+    protected String getBaseAddress() {
+        return "/async/bookstore";
+    }
+    
     protected String getPort() {
         return PORT;
     }

Modified: cxf/branches/2.7.x-fixes/systests/jaxrs/src/test/resources/jaxrs_async/WEB-INF/beans.xml
URL: http://svn.apache.org/viewvc/cxf/branches/2.7.x-fixes/systests/jaxrs/src/test/resources/jaxrs_async/WEB-INF/beans.xml?rev=1543203&r1=1543202&r2=1543203&view=diff
==============================================================================
--- cxf/branches/2.7.x-fixes/systests/jaxrs/src/test/resources/jaxrs_async/WEB-INF/beans.xml
(original)
+++ cxf/branches/2.7.x-fixes/systests/jaxrs/src/test/resources/jaxrs_async/WEB-INF/beans.xml
Mon Nov 18 22:32:11 2013
@@ -17,37 +17,38 @@
   specific language governing permissions and limitations
   under the License.
 -->
-<!-- START SNIPPET: beans -->
-<!--beans xmlns="http://www.springframework.org/schema/beans"
-  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-  xmlns:simple="http://cxf.apache.org/simple"
-  xsi:schemaLocation="
-  http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
-  http://cxf.apache.org/simple http://cxf.apache.org/schemas/simple.xsd"-->
-<beans xmlns="http://www.springframework.org/schema/beans"
-  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-  xmlns:util="http://www.springframework.org/schema/util"
-  xmlns:jaxrs="http://cxf.apache.org/jaxrs"
-  xmlns:cxf="http://cxf.apache.org/core"
-  xsi:schemaLocation="
-http://www.springframework.org/schema/beans 
-http://www.springframework.org/schema/beans/spring-beans.xsd
-http://www.springframework.org/schema/util 
-http://www.springframework.org/schema/util/spring-util.xsd
-http://cxf.apache.org/jaxrs
-http://cxf.apache.org/schemas/jaxrs.xsd
-http://cxf.apache.org/core
-http://cxf.apache.org/schemas/core.xsd">
-
-  <import resource="classpath:META-INF/cxf/cxf.xml" />
-  <import resource="classpath:META-INF/cxf/cxf-servlet.xml" />
-
-  <bean class="org.apache.cxf.systest.jaxrs.BookContinuationStore" id="serviceBean"/>
-  
-  <jaxrs:server id="bookservice" address="/">
-    <jaxrs:serviceBeans>
-      <ref bean="serviceBean" />
-    </jaxrs:serviceBeans>		   
-  </jaxrs:server>
+<beans xmlns="http://www.springframework.org/schema/beans" 
+    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
+    xmlns:jaxrs="http://cxf.apache.org/jaxrs"
+    xmlns:task="http://www.springframework.org/schema/task" 
+    xsi:schemaLocation="
+     http://www.springframework.org/schema/beans  http://www.springframework.org/schema/beans/spring-beans.xsd
+     http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task.xsd

+     http://cxf.apache.org/jaxrs http://cxf.apache.org/schemas/jaxrs.xsd">
+     
+    <import resource="classpath:META-INF/cxf/cxf.xml"/>
+    <import resource="classpath:META-INF/cxf/cxf-servlet.xml"/>
+    
+    <bean class="org.apache.cxf.systest.jaxrs.BookContinuationStore" id="serviceBean"/>
+    
+    <jaxrs:server id="bookservice" address="/async">
+        <jaxrs:serviceBeans>
+            <ref bean="serviceBean"/>
+        </jaxrs:serviceBeans>
+    </jaxrs:server>
+    
+    <jaxrs:server id="bookservice2" address="/asyncexecutor">
+    
+        <jaxrs:executor>
+            <ref bean="workerPool" />
+        </jaxrs:executor>
+        
+        <jaxrs:serviceBeans>
+            <ref bean="serviceBean"/>
+        </jaxrs:serviceBeans>
+    </jaxrs:server>
+    
+    <task:executor id="workerPool" pool-size="1" queue-capacity="1"/>
+    
 </beans>
 <!-- END SNIPPET: beans -->



Mime
View raw message