Author: davsclaus
Date: Sat Dec 15 13:03:11 2012
New Revision: 1422241

URL: http://svn.apache.org/viewvc?rev=1422241&view=rev
Log:
CAMEL-5867: Jetty producer creates a new http client and uses any 
httpClient.xxx options configured. This avoids issue with handling proper 
lifecycle of these clients.

Modified:
    
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/JettyHttpComponent.java
URL: 
http://svn.apache.org/viewvc/camel/trunk/components/camel-jetty/src/main/java/org/apache/camel/component/jetty/JettyHttpComponent.java?rev=1422241&r1=1422240&r2=1422241&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
 Sat Dec 15 13:03:11 2012
@@ -127,8 +127,7 @@ public class JettyHttpComponent extends 
 
     @Override
     protected Endpoint createEndpoint(String uri, String remaining, 
Map<String, Object> parameters) throws Exception {
-        Map<String, Object> httpClientParameters = new HashMap<String, 
Object>(parameters);
-        
+
         // must extract well known parameters before we create the endpoint
         List<Handler> handlerList = 
resolveAndRemoveReferenceListParameter(parameters, "handlers", Handler.class);
         HttpBinding binding = resolveAndRemoveReferenceParameter(parameters, 
"httpBindingRef", HttpBinding.class);
@@ -147,40 +146,20 @@ public class JettyHttpComponent extends 
         String httpMethodRestrict = getAndRemoveParameter(parameters, 
"httpMethodRestrict", String.class);
         SSLContextParameters sslContextParameters = 
resolveAndRemoveReferenceParameter(parameters, "sslContextParametersRef", 
SSLContextParameters.class);
         SSLContextParameters ssl = sslContextParameters != null ? 
sslContextParameters : this.sslContextParameters;
-
-        // configure http client if we have url configuration for it
-        // http client is only used for jetty http producer (hence not very 
commonly used)
-        HttpClient client = null;
-        if (IntrospectionSupport.hasProperties(parameters, "httpClient.") || 
sslContextParameters != null) {
-            client = createHttpClient(httpClientMinThreads, 
httpClientMaxThreads, ssl);
-
-            if (IntrospectionSupport.hasProperties(parameters, "httpClient.")) 
{
-                // set additional parameters on http client
-                IntrospectionSupport.setProperties(client, parameters, 
"httpClient.");
-                // validate that we could resolve all httpClient. parameters 
as this component is lenient
-                validateParameters(uri, parameters, "httpClient.");
-            }
-            
-            if (ssl != null) {
-                ((CamelHttpClient) 
client).setSSLContext(ssl.createSSLContext());
-            }
-        }
-        // keep the configure parameters for the http client
-        for (String key : parameters.keySet()) {
-            httpClientParameters.remove(key);
-        }
+        // extract httpClient. parameters
+        Map<String, Object> httpClientParameters = 
IntrospectionSupport.extractProperties(parameters, "httpClient.");
 
         String address = remaining;
         URI addressUri = new URI(UnsafeUriCharactersEncoder.encode(address));
-        URI endpointUri = URISupport.createRemainingURI(addressUri, 
httpClientParameters);
+        URI endpointUri = URISupport.createRemainingURI(addressUri, 
parameters);
         // restructure uri to be based on the parameters left as we dont want 
to include the Camel internal options
         URI httpUri = URISupport.createRemainingURI(addressUri, parameters);
         // create endpoint after all known parameters have been extracted from 
parameters
         JettyHttpEndpoint endpoint = new JettyHttpEndpoint(this, 
endpointUri.toString(), httpUri);
         setEndpointHeaderFilterStrategy(endpoint);
 
-        if (client != null) {
-            endpoint.setClient(client);
+        if (httpClientParameters != null && !httpClientParameters.isEmpty()) {
+            endpoint.setHttpClientParameters(httpClientParameters);
         }
         if (handlerList.size() > 0) {
             endpoint.setHandlers(handlerList);

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=1422241&r1=1422240&r2=1422241&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
 Sat Dec 15 13:03:11 2012
@@ -18,15 +18,19 @@ package org.apache.camel.component.jetty
 
 import java.net.URI;
 import java.net.URISyntaxException;
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
 import javax.servlet.Filter;
 
 import org.apache.camel.Consumer;
 import org.apache.camel.Processor;
 import org.apache.camel.Producer;
+import org.apache.camel.ResolveEndpointFailedException;
 import org.apache.camel.component.http.HttpConsumer;
 import org.apache.camel.component.http.HttpEndpoint;
 import org.apache.camel.impl.SynchronousDelegateProducer;
+import org.apache.camel.util.IntrospectionSupport;
 import org.apache.camel.util.jsse.SSLContextParameters;
 import org.eclipse.jetty.client.HttpClient;
 import org.eclipse.jetty.server.Handler;
@@ -49,6 +53,7 @@ public class JettyHttpEndpoint extends H
     private Long continuationTimeout;
     private Boolean useContinuation;
     private SSLContextParameters sslContextParameters;
+    private Map<String, Object> httpClientParameters;
 
     public JettyHttpEndpoint(JettyHttpComponent component, String uri, URI 
httpURL) throws URISyntaxException {
         super(uri, component, httpURL);
@@ -63,15 +68,32 @@ public class JettyHttpEndpoint extends H
     public Producer createProducer() throws Exception {
         JettyHttpProducer answer = new JettyHttpProducer(this);
         if (client != null) {
-            // use shared client
+            // use shared client, and ensure its started so we can use it
+            client.start();
             answer.setSharedClient(client);
         } else {
             // create a new client
             // thread pool min/max from endpoint take precedence over from 
component
             Integer min = httpClientMinThreads != null ? httpClientMinThreads 
: getComponent().getHttpClientMinThreads();
             Integer max = httpClientMaxThreads != null ? httpClientMaxThreads 
: getComponent().getHttpClientMaxThreads();
-            answer.setClient(JettyHttpComponent.createHttpClient(min, max, 
sslContextParameters));
+            HttpClient httpClient = JettyHttpComponent.createHttpClient(min, 
max, sslContextParameters);
+
+            // set optional http client parameters
+            if (httpClientParameters != null) {
+                // copy parameters as we need to re-use them again if creating 
a new producer later
+                Map<String, Object> params = new HashMap<String, 
Object>(httpClientParameters);
+                IntrospectionSupport.setProperties(httpClient, params);
+                // validate we could set all parameters
+                if (params.size() > 0) {
+                    throw new ResolveEndpointFailedException(getEndpointUri(), 
"There are " + params.size()
+                            + " parameters that couldn't be set on the 
endpoint."
+                            + " Check the uri if the parameters are spelt 
correctly and that they are properties of the endpoint."
+                            + " Unknown parameters=[" + params + "]");
+                }
+            }
+            answer.setClient(httpClient);
         }
+
         answer.setBinding(getJettyBinding());
         if (isSynchronous()) {
             return new SynchronousDelegateProducer(answer);
@@ -110,6 +132,11 @@ public class JettyHttpEndpoint extends H
      * created by this endpoint. By default each producer will
      * use a new http client, and not share.
      * <p/>
+     * <b>Important: </b> Make sure to handle the lifecycle of the shared
+     * client, such as stopping the client, when it is no longer in use.
+     * Camel will call the <tt>start</tt> method on the client to ensure
+     * its started when this endpoint creates a producer.
+     * <p/>
      * This options should only be used in special circumstances.
      */
     public void setClient(HttpClient client) {
@@ -186,19 +213,28 @@ public class JettyHttpEndpoint extends H
         this.sslContextParameters = sslContextParameters;
     }
 
-    @Override
-    protected void doStart() throws Exception {
-        if (client != null) {
-            client.start();
-        }
-        super.doStart();
+    public Integer getHttpClientMinThreads() {
+        return httpClientMinThreads;
     }
 
-    @Override
-    protected void doStop() throws Exception {
-        super.doStop();
-        if (client != null) {
-            client.stop();
-        }
+    public void setHttpClientMinThreads(Integer httpClientMinThreads) {
+        this.httpClientMinThreads = httpClientMinThreads;
+    }
+
+    public Integer getHttpClientMaxThreads() {
+        return httpClientMaxThreads;
+    }
+
+    public void setHttpClientMaxThreads(Integer httpClientMaxThreads) {
+        this.httpClientMaxThreads = httpClientMaxThreads;
     }
+
+    public Map<String, Object> getHttpClientParameters() {
+        return httpClientParameters;
+    }
+
+    public void setHttpClientParameters(Map<String, Object> 
httpClientParameters) {
+        this.httpClientParameters = httpClientParameters;
+    }
+
 }


Reply via email to