You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by da...@apache.org on 2011/01/10 16:22:54 UTC

svn commit: r1057238 - in /camel/trunk/components/camel-jetty/src: main/java/org/apache/camel/component/jetty/ test/java/org/apache/camel/component/jetty/async/

Author: davsclaus
Date: Mon Jan 10 15:22:53 2011
New Revision: 1057238

URL: http://svn.apache.org/viewvc?rev=1057238&view=rev
Log:
CAMEL-3524: Added option to set timeout when using Jetty continuation. The default timeout of 30 sec. is sometime to slow for some systems.

Added:
    camel/trunk/components/camel-jetty/src/test/java/org/apache/camel/component/jetty/async/JettyAsyncContinuationTimeoutOkTest.java   (contents, props changed)
      - copied, changed from r1057163, camel/trunk/components/camel-jetty/src/test/java/org/apache/camel/component/jetty/async/JettyAsyncTest.java
    camel/trunk/components/camel-jetty/src/test/java/org/apache/camel/component/jetty/async/JettyAsyncContinuationTimeoutTest.java
Modified:
    camel/trunk/components/camel-jetty/src/main/java/org/apache/camel/component/jetty/CamelContinuationServlet.java
    camel/trunk/components/camel-jetty/src/main/java/org/apache/camel/component/jetty/JettyHttpComponent.java
    camel/trunk/components/camel-jetty/src/main/java/org/apache/camel/component/jetty/JettyHttpEndpoint.java

Modified: camel/trunk/components/camel-jetty/src/main/java/org/apache/camel/component/jetty/CamelContinuationServlet.java
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-jetty/src/main/java/org/apache/camel/component/jetty/CamelContinuationServlet.java?rev=1057238&r1=1057237&r2=1057238&view=diff
==============================================================================
--- camel/trunk/components/camel-jetty/src/main/java/org/apache/camel/component/jetty/CamelContinuationServlet.java (original)
+++ camel/trunk/components/camel-jetty/src/main/java/org/apache/camel/component/jetty/CamelContinuationServlet.java Mon Jan 10 15:22:53 2011
@@ -42,9 +42,15 @@ public class CamelContinuationServlet ex
     static final String EXCHANGE_ATTRIBUTE_ID = "CamelExchangeId";
 
     private static final long serialVersionUID = 1L;
+    // jetty will by default use 30000 millis as default timeout
+    private Long continuationTimeout;
 
     @Override
     protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
+        if (log.isTraceEnabled()) {
+            log.trace("Service: " + request);
+        }
+
         // is there a consumer registered for the request.
         HttpConsumer consumer = resolve(request);
         if (consumer == null) {
@@ -56,6 +62,9 @@ public class CamelContinuationServlet ex
         if (result == null) {
             // no asynchronous result so leverage continuation
             final Continuation continuation = ContinuationSupport.getContinuation(request);
+            if (continuationTimeout != null) {
+                continuation.setTimeout(continuationTimeout);
+            }
 
             // are we suspended and a request is dispatched initially?
             if (consumer.isSuspended() && continuation.isInitial()) {
@@ -106,7 +115,7 @@ public class CamelContinuationServlet ex
 
         try {
             if (log.isTraceEnabled()) {
-                log.trace("Resuming continuation of exchangeId: " + result.getExchangeId());
+                log.trace("Resumed continuation and writing response for exchangeId: " + result.getExchangeId());
             }
             // now lets output to the response
             consumer.getBinding().writeResponse(result, response);
@@ -116,4 +125,11 @@ public class CamelContinuationServlet ex
         }
     }
 
+    public Long getContinuationTimeout() {
+        return continuationTimeout;
+    }
+
+    public void setContinuationTimeout(Long continuationTimeout) {
+        this.continuationTimeout = continuationTimeout;
+    }
 }

Modified: camel/trunk/components/camel-jetty/src/main/java/org/apache/camel/component/jetty/JettyHttpComponent.java
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-jetty/src/main/java/org/apache/camel/component/jetty/JettyHttpComponent.java?rev=1057238&r1=1057237&r2=1057238&view=diff
==============================================================================
--- camel/trunk/components/camel-jetty/src/main/java/org/apache/camel/component/jetty/JettyHttpComponent.java (original)
+++ camel/trunk/components/camel-jetty/src/main/java/org/apache/camel/component/jetty/JettyHttpComponent.java Mon Jan 10 15:22:53 2011
@@ -94,6 +94,7 @@ public class JettyHttpComponent extends 
     protected MBeanContainer mbContainer;
     protected boolean enableJmx;
     protected JettyHttpBinding jettyHttpBinding;
+    protected Long continuationTimeout;
 
     class ConnectorRef {
         Server server;
@@ -138,6 +139,7 @@ public class JettyHttpComponent extends 
         Boolean enableMultipartFilter = getAndRemoveParameter(parameters, "enableMultipartFilter",
                                                               Boolean.class, true);
         Filter multipartFilter = resolveAndRemoveReferenceParameter(parameters, "multipartFilterRef", Filter.class);
+        Long continuationTimeout = getAndRemoveParameter(parameters, "continuationTimeout", Long.class);
 
         // configure http client if we have url configuration for it
         // http client is only used for jetty http producer (hence not very commonly used)
@@ -214,6 +216,10 @@ public class JettyHttpComponent extends 
             endpoint.setEnableMultipartFilter(true);
         }
 
+        if (continuationTimeout != null) {
+            endpoint.setContinuationTimeout(continuationTimeout);
+        }
+
         setProperties(endpoint, parameters);
         return endpoint;
     }
@@ -248,7 +254,7 @@ public class JettyHttpComponent extends 
                 }
                 server.addConnector(connector);
 
-                connectorRef = new ConnectorRef(server, connector, createServletForConnector(server, connector, endpoint.getHandlers()));
+                connectorRef = new ConnectorRef(server, connector, createServletForConnector(server, connector, endpoint.getHandlers(), endpoint));
                 // must enable session before we start
                 if (endpoint.isSessionSupport()) {
                     enableSessionSupport(connectorRef.server, connectorKey);
@@ -639,9 +645,18 @@ public class JettyHttpComponent extends 
         sslSocketConnectorProperties.put(key, value);
     }
 
+    public Long getContinuationTimeout() {
+        return continuationTimeout;
+    }
+
+    public void setContinuationTimeout(Long continuationTimeout) {
+        this.continuationTimeout = continuationTimeout;
+    }
+
     // Implementation methods
     // -------------------------------------------------------------------------
-    protected CamelServlet createServletForConnector(Server server, Connector connector, List<Handler> handlers) throws Exception {
+    protected CamelServlet createServletForConnector(Server server, Connector connector,
+                                                     List<Handler> handlers, JettyHttpEndpoint endpoint) throws Exception {
         ServletContextHandler context = new ServletContextHandler(server, "/", ServletContextHandler.NO_SECURITY | ServletContextHandler.NO_SESSIONS);
         context.setConnectorNames(new String[] {connector.getName()});
 
@@ -660,7 +675,16 @@ public class JettyHttpComponent extends 
         }
 
         // use Jetty continuations
-        CamelServlet camelServlet = new CamelContinuationServlet();
+        CamelContinuationServlet camelServlet = new CamelContinuationServlet();
+        // configure timeout and log it so end user know what we are using
+        Long timeout = endpoint.getContinuationTimeout() != null ? endpoint.getContinuationTimeout() : getContinuationTimeout();
+        if (timeout != null) {
+            LOG.info("Using Jetty continuation timeout: " + timeout + " millis for: " + endpoint);
+            camelServlet.setContinuationTimeout(timeout);
+        } else {
+            LOG.info("Using default Jetty continuation timeout for: " + endpoint);
+        }
+
         ServletHolder holder = new ServletHolder();
         holder.setServlet(camelServlet);
         context.addServlet(holder, "/*");

Modified: camel/trunk/components/camel-jetty/src/main/java/org/apache/camel/component/jetty/JettyHttpEndpoint.java
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-jetty/src/main/java/org/apache/camel/component/jetty/JettyHttpEndpoint.java?rev=1057238&r1=1057237&r2=1057238&view=diff
==============================================================================
--- camel/trunk/components/camel-jetty/src/main/java/org/apache/camel/component/jetty/JettyHttpEndpoint.java (original)
+++ camel/trunk/components/camel-jetty/src/main/java/org/apache/camel/component/jetty/JettyHttpEndpoint.java Mon Jan 10 15:22:53 2011
@@ -43,6 +43,7 @@ public class JettyHttpEndpoint extends H
     private boolean enableJmx;
     private boolean enableMultipartFilter;
     private Filter multipartFilter;
+    private Long continuationTimeout;
 
     public JettyHttpEndpoint(JettyHttpComponent component, String uri, URI httpURL) throws URISyntaxException {
         super(uri, component, httpURL);
@@ -133,4 +134,12 @@ public class JettyHttpEndpoint extends H
     public Filter getMultipartFilter() {
         return multipartFilter;
     }
+
+    public Long getContinuationTimeout() {
+        return continuationTimeout;
+    }
+
+    public void setContinuationTimeout(Long continuationTimeout) {
+        this.continuationTimeout = continuationTimeout;
+    }
 }

Copied: camel/trunk/components/camel-jetty/src/test/java/org/apache/camel/component/jetty/async/JettyAsyncContinuationTimeoutOkTest.java (from r1057163, camel/trunk/components/camel-jetty/src/test/java/org/apache/camel/component/jetty/async/JettyAsyncTest.java)
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-jetty/src/test/java/org/apache/camel/component/jetty/async/JettyAsyncContinuationTimeoutOkTest.java?p2=camel/trunk/components/camel-jetty/src/test/java/org/apache/camel/component/jetty/async/JettyAsyncContinuationTimeoutOkTest.java&p1=camel/trunk/components/camel-jetty/src/test/java/org/apache/camel/component/jetty/async/JettyAsyncTest.java&r1=1057163&r2=1057238&rev=1057238&view=diff
==============================================================================
--- camel/trunk/components/camel-jetty/src/test/java/org/apache/camel/component/jetty/async/JettyAsyncTest.java (original)
+++ camel/trunk/components/camel-jetty/src/test/java/org/apache/camel/component/jetty/async/JettyAsyncContinuationTimeoutOkTest.java Mon Jan 10 15:22:53 2011
@@ -23,10 +23,10 @@ import org.junit.Test;
 /**
  * @version $Revision$
  */
-public class JettyAsyncTest extends BaseJettyTest {
+public class JettyAsyncContinuationTimeoutOkTest extends BaseJettyTest {
 
     @Test
-    public void testJettyAsync() throws Exception {
+    public void testJettyAsyncTimeoutOk() throws Exception {
         getMockEndpoint("mock:result").expectedBodiesReceived("Bye World");
 
         String reply = template.requestBody("http://localhost:{{port}}/myservice", null, String.class);
@@ -42,7 +42,7 @@ public class JettyAsyncTest extends Base
             public void configure() throws Exception {
                 context.addComponent("async", new MyAsyncComponent());
 
-                from("jetty:http://localhost:{{port}}/myservice")
+                from("jetty:http://localhost:{{port}}/myservice?continuationTimeout=3000")
                     .to("async:Bye World")
                     .to("mock:result");
             }

Propchange: camel/trunk/components/camel-jetty/src/test/java/org/apache/camel/component/jetty/async/JettyAsyncContinuationTimeoutOkTest.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: camel/trunk/components/camel-jetty/src/test/java/org/apache/camel/component/jetty/async/JettyAsyncContinuationTimeoutOkTest.java
------------------------------------------------------------------------------
    svn:keywords = Rev Date

Added: camel/trunk/components/camel-jetty/src/test/java/org/apache/camel/component/jetty/async/JettyAsyncContinuationTimeoutTest.java
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-jetty/src/test/java/org/apache/camel/component/jetty/async/JettyAsyncContinuationTimeoutTest.java?rev=1057238&view=auto
==============================================================================
--- camel/trunk/components/camel-jetty/src/test/java/org/apache/camel/component/jetty/async/JettyAsyncContinuationTimeoutTest.java (added)
+++ camel/trunk/components/camel-jetty/src/test/java/org/apache/camel/component/jetty/async/JettyAsyncContinuationTimeoutTest.java Mon Jan 10 15:22:53 2011
@@ -0,0 +1,67 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.jetty.async;
+
+import org.apache.camel.CamelExecutionException;
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.component.http.HttpOperationFailedException;
+import org.apache.camel.component.jetty.BaseJettyTest;
+import org.apache.camel.util.StopWatch;
+import org.junit.Test;
+
+/**
+ * @version $Revision: 1027376 $
+ */
+public class JettyAsyncContinuationTimeoutTest extends BaseJettyTest {
+
+    @Test
+    public void testJettyAsyncTimeout() throws Exception {
+        getMockEndpoint("mock:result").expectedBodiesReceived("Bye World");
+
+        StopWatch watch = new StopWatch();
+        try {
+            template.requestBody("http://localhost:{{port}}/myservice", null, String.class);
+            fail("Should have thrown an exception");
+        } catch (CamelExecutionException e) {
+            log.info("Timeout hit and client got reply with failure status code");
+
+            long taken = watch.stop();
+
+            HttpOperationFailedException cause = assertIsInstanceOf(HttpOperationFailedException.class, e.getCause());
+            assertEquals(503, cause.getStatusCode());
+
+            // should be approx 3-4 sec.
+            assertTrue("Timeout should occur faster than " + taken, taken < 4500);
+        }
+
+        assertMockEndpointsSatisfied();
+    }
+
+    @Override
+    protected RouteBuilder createRouteBuilder() throws Exception {
+        return new RouteBuilder() {
+            @Override
+            public void configure() throws Exception {
+                context.addComponent("async", new MyAsyncComponent());
+
+                from("jetty:http://localhost:{{port}}/myservice?continuationTimeout=3000")
+                    .to("async:Bye World?delay=6000")
+                    .to("mock:result");
+            }
+        };
+    }
+}