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;
+ }
+
}