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 2010/09/15 12:26:24 UTC
svn commit: r997262 - in /camel/trunk:
camel-core/src/main/java/org/apache/camel/converter/
camel-core/src/main/java/org/apache/camel/impl/converter/
camel-core/src/test/java/org/apache/camel/converter/
camel-core/src/test/resources/ components/camel-j...
Author: davsclaus
Date: Wed Sep 15 10:26:23 2010
New Revision: 997262
URL: http://svn.apache.org/viewvc?rev=997262&view=rev
Log:
CAMEL-3123: Fixed performance degration in camel-jetty due type converter lookup falling back to fallback type converters instead of using Jetty specific converters.
Added:
camel/trunk/components/camel-jetty/src/main/java/org/apache/camel/component/jetty/JettyConverter.java
camel/trunk/components/camel-jetty/src/main/resources/META-INF/services/org/apache/camel/TypeConverter
camel/trunk/components/camel-jetty/src/test/java/org/apache/camel/component/jetty/HttpProxyRouteTest.java
- copied, changed from r997217, camel/trunk/components/camel-jetty/src/test/java/org/apache/camel/component/jetty/HttpBridgeRouteTest.java
Modified:
camel/trunk/camel-core/src/main/java/org/apache/camel/converter/ObjectConverter.java
camel/trunk/camel-core/src/main/java/org/apache/camel/impl/converter/DefaultTypeConverter.java
camel/trunk/camel-core/src/main/java/org/apache/camel/impl/converter/PropertyEditorTypeConverter.java
camel/trunk/camel-core/src/test/java/org/apache/camel/converter/ObjectConverterTest.java
camel/trunk/camel-core/src/test/resources/log4j.properties
camel/trunk/components/camel-jetty/src/test/resources/log4j.properties
Modified: camel/trunk/camel-core/src/main/java/org/apache/camel/converter/ObjectConverter.java
URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/converter/ObjectConverter.java?rev=997262&r1=997261&r2=997262&view=diff
==============================================================================
--- camel/trunk/camel-core/src/main/java/org/apache/camel/converter/ObjectConverter.java (original)
+++ camel/trunk/camel-core/src/main/java/org/apache/camel/converter/ObjectConverter.java Wed Sep 15 10:26:23 2010
@@ -207,4 +207,14 @@ public final class ObjectConverter {
return value.toString();
}
+ @Converter
+ public static String toString(StringBuffer value) {
+ return value.toString();
+ }
+
+ @Converter
+ public static String toString(StringBuilder value) {
+ return value.toString();
+ }
+
}
Modified: camel/trunk/camel-core/src/main/java/org/apache/camel/impl/converter/DefaultTypeConverter.java
URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/impl/converter/DefaultTypeConverter.java?rev=997262&r1=997261&r2=997262&view=diff
==============================================================================
--- camel/trunk/camel-core/src/main/java/org/apache/camel/impl/converter/DefaultTypeConverter.java (original)
+++ camel/trunk/camel-core/src/main/java/org/apache/camel/impl/converter/DefaultTypeConverter.java Wed Sep 15 10:26:23 2010
@@ -67,12 +67,12 @@ public class DefaultTypeConverter extend
// always convert something to a string so we want it only as the last resort
// ToStringTypeConverter should NOT allow to be promoted
addFallbackTypeConverter(new ToStringTypeConverter(), false);
+ // do not assume property editor as it has a String converter
+ addFallbackTypeConverter(new PropertyEditorTypeConverter(), false);
// enum is okay to be promoted
addFallbackTypeConverter(new EnumTypeConverter(), true);
// arrays is okay to be promoted
addFallbackTypeConverter(new ArrayTypeConverter(), true);
- // do not assume property editor as it has a String converter
- addFallbackTypeConverter(new PropertyEditorTypeConverter(), false);
// and future should also not allowed to be promoted
addFallbackTypeConverter(new FutureTypeConverter(this), false);
// add sync processor to async processor converter is to be promoted
Modified: camel/trunk/camel-core/src/main/java/org/apache/camel/impl/converter/PropertyEditorTypeConverter.java
URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/impl/converter/PropertyEditorTypeConverter.java?rev=997262&r1=997261&r2=997262&view=diff
==============================================================================
--- camel/trunk/camel-core/src/main/java/org/apache/camel/impl/converter/PropertyEditorTypeConverter.java (original)
+++ camel/trunk/camel-core/src/main/java/org/apache/camel/impl/converter/PropertyEditorTypeConverter.java Wed Sep 15 10:26:23 2010
@@ -22,6 +22,8 @@ import java.beans.PropertyEditorManager;
import org.apache.camel.Exchange;
import org.apache.camel.TypeConverter;
import org.apache.camel.util.ObjectHelper;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
/**
* Uses the {@link java.beans.PropertyEditor} conversion system to convert Objects to
@@ -31,6 +33,8 @@ import org.apache.camel.util.ObjectHelpe
*/
public class PropertyEditorTypeConverter implements TypeConverter {
+ private static final Log LOG = LogFactory.getLog(PropertyEditorTypeConverter.class);
+
public <T> T convertTo(Class<T> type, Object value) {
// We can't convert null values since we can't figure out a property
// editor for it.
@@ -44,13 +48,21 @@ public class PropertyEditorTypeConverter
return ObjectHelper.cast(type, value);
}
+ // TODO: findEditor is synchronized so we want to avoid calling it
+ // we should have a local hit cache
PropertyEditor editor = PropertyEditorManager.findEditor(type);
+ if (LOG.isTraceEnabled()) {
+ LOG.trace("Finding property editor for type: " + type + " -> " + editor);
+ }
if (editor != null) {
editor.setAsText(value.toString());
return ObjectHelper.cast(type, editor.getValue());
}
} else if (type == String.class) {
PropertyEditor editor = PropertyEditorManager.findEditor(value.getClass());
+ if (LOG.isTraceEnabled()) {
+ LOG.trace("Finding property editor for type: " + type + " -> " + editor);
+ }
if (editor != null) {
editor.setValue(value);
return ObjectHelper.cast(type, editor.getAsText());
Modified: camel/trunk/camel-core/src/test/java/org/apache/camel/converter/ObjectConverterTest.java
URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/test/java/org/apache/camel/converter/ObjectConverterTest.java?rev=997262&r1=997261&r2=997262&view=diff
==============================================================================
--- camel/trunk/camel-core/src/test/java/org/apache/camel/converter/ObjectConverterTest.java (original)
+++ camel/trunk/camel-core/src/test/java/org/apache/camel/converter/ObjectConverterTest.java Wed Sep 15 10:26:23 2010
@@ -76,11 +76,18 @@ public class ObjectConverterTest extends
assertEquals(null, ObjectConverter.toFloat(new Date()));
}
- public void testToDouable() {
+ public void testToDouble() {
assertEquals(Double.valueOf("4"), ObjectConverter.toDouble(Double.valueOf("4")));
assertEquals(Double.valueOf("4"), ObjectConverter.toDouble(Integer.valueOf("4")));
assertEquals(Double.valueOf("4"), ObjectConverter.toDouble("4"));
assertEquals(null, ObjectConverter.toDouble(new Date()));
}
+ public void testToString() {
+ assertEquals("ABC", ObjectConverter.toString(new StringBuffer("ABC")));
+ assertEquals("ABC", ObjectConverter.toString(new StringBuilder("ABC")));
+ assertEquals("", ObjectConverter.toString(new StringBuffer("")));
+ assertEquals("", ObjectConverter.toString(new StringBuilder("")));
+ }
+
}
Modified: camel/trunk/camel-core/src/test/resources/log4j.properties
URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/test/resources/log4j.properties?rev=997262&r1=997261&r2=997262&view=diff
==============================================================================
--- camel/trunk/camel-core/src/test/resources/log4j.properties (original)
+++ camel/trunk/camel-core/src/test/resources/log4j.properties Wed Sep 15 10:26:23 2010
@@ -24,6 +24,7 @@ log4j.logger.org.apache.camel.impl.conve
log4j.logger.org.apache.camel.management=WARN
log4j.logger.org.apache.camel.impl.DefaultPackageScanClassResolver=WARN
#log4j.logger.org.apache.camel.impl.converter.DefaultTypeConverter=TRACE
+#log4j.logger.org.apache.camel.impl.converter.PropertyEditorTypeConverter=TRACE
#log4j.logger.org.apache.camel=DEBUG
#log4j.logger.org.apache.camel.language.simple=TRACE
Added: camel/trunk/components/camel-jetty/src/main/java/org/apache/camel/component/jetty/JettyConverter.java
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-jetty/src/main/java/org/apache/camel/component/jetty/JettyConverter.java?rev=997262&view=auto
==============================================================================
--- camel/trunk/components/camel-jetty/src/main/java/org/apache/camel/component/jetty/JettyConverter.java (added)
+++ camel/trunk/components/camel-jetty/src/main/java/org/apache/camel/component/jetty/JettyConverter.java Wed Sep 15 10:26:23 2010
@@ -0,0 +1,50 @@
+/**
+ * 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;
+
+import org.apache.camel.Converter;
+import org.apache.camel.Exchange;
+import org.apache.camel.FallbackConverter;
+import org.apache.camel.spi.TypeConverterRegistry;
+import org.eclipse.jetty.server.Request;
+import org.eclipse.jetty.server.Response;
+
+/**
+ * @version $Revision$
+ */
+@Converter
+public final class JettyConverter {
+
+ @Converter
+ public static String toString(Response response) {
+ return response.toString();
+ }
+
+ @FallbackConverter
+ @SuppressWarnings("unchecked")
+ public static <T> T convertTo(Class<T> type, Exchange exchange, Object value, TypeConverterRegistry registry) {
+ if (value != null) {
+ // should not try to convert Request as its not possible
+ if (Request.class.isAssignableFrom(value.getClass())) {
+ return (T) Void.TYPE;
+ }
+ }
+
+ return null;
+ }
+
+}
Added: camel/trunk/components/camel-jetty/src/main/resources/META-INF/services/org/apache/camel/TypeConverter
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-jetty/src/main/resources/META-INF/services/org/apache/camel/TypeConverter?rev=997262&view=auto
==============================================================================
--- camel/trunk/components/camel-jetty/src/main/resources/META-INF/services/org/apache/camel/TypeConverter (added)
+++ camel/trunk/components/camel-jetty/src/main/resources/META-INF/services/org/apache/camel/TypeConverter Wed Sep 15 10:26:23 2010
@@ -0,0 +1,18 @@
+#
+# 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.
+#
+
+org.apache.camel.component.jetty
Copied: camel/trunk/components/camel-jetty/src/test/java/org/apache/camel/component/jetty/HttpProxyRouteTest.java (from r997217, camel/trunk/components/camel-jetty/src/test/java/org/apache/camel/component/jetty/HttpBridgeRouteTest.java)
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-jetty/src/test/java/org/apache/camel/component/jetty/HttpProxyRouteTest.java?p2=camel/trunk/components/camel-jetty/src/test/java/org/apache/camel/component/jetty/HttpProxyRouteTest.java&p1=camel/trunk/components/camel-jetty/src/test/java/org/apache/camel/component/jetty/HttpBridgeRouteTest.java&r1=997217&r2=997262&rev=997262&view=diff
==============================================================================
--- camel/trunk/components/camel-jetty/src/test/java/org/apache/camel/component/jetty/HttpBridgeRouteTest.java (original)
+++ camel/trunk/components/camel-jetty/src/test/java/org/apache/camel/component/jetty/HttpProxyRouteTest.java Wed Sep 15 10:26:23 2010
@@ -16,49 +16,36 @@
*/
package org.apache.camel.component.jetty;
-import java.io.ByteArrayInputStream;
-
-import org.apache.camel.Exchange;
-import org.apache.camel.Processor;
-import org.apache.camel.RuntimeCamelException;
import org.apache.camel.builder.RouteBuilder;
import org.apache.camel.test.junit4.CamelTestSupport;
+import org.apache.camel.util.StopWatch;
+import org.apache.camel.util.TimeUtils;
import org.junit.Test;
-public class HttpBridgeRouteTest extends CamelTestSupport {
+public class HttpProxyRouteTest extends CamelTestSupport {
+
+ private int size = 500;
@Test
- public void testHttpClient() throws Exception {
- String response = template.requestBodyAndHeader("http://localhost:9090/test/hello", new ByteArrayInputStream("This is a test".getBytes()), "Content-Type", "application/xml", String.class);
- assertEquals("Get a wrong response", "/", response);
-
- response = template.requestBody("http://localhost:9080/hello/world", "hello", String.class);
- assertEquals("Get a wrong response", "/hello/world", response);
-
- try {
- template.requestBody("http://localhost:9090/hello/world", "hello", String.class);
- fail("Expect exception here!");
- } catch (Exception ex) {
- assertTrue("We should get a RuntimeCamelException", ex instanceof RuntimeCamelException);
+ public void testHttpProxy() throws Exception {
+ log.info("Sending " + size + " messages to a http endpoint which is proxied/bridged");
+
+ StopWatch watch = new StopWatch();
+ for (int i = 0; i < size; i++) {
+ String out = template.requestBody("http://localhost:9080/hello?foo=" + i, null, String.class);
+ assertEquals("Bye " + i, out);
}
+
+ log.info("Time taken: " + TimeUtils.printDuration(watch.taken()));
}
protected RouteBuilder createRouteBuilder() throws Exception {
return new RouteBuilder() {
public void configure() {
- errorHandler(noErrorHandler());
+ from("jetty://http://localhost:9080/hello")
+ .to("http://localhost:9080/bye?throwExceptionOnFailure=false&bridgeEndpoint=true");
- Processor serviceProc = new Processor() {
- public void process(Exchange exchange) throws Exception {
- // get the request URL and copy it to the request body
- String uri = exchange.getIn().getHeader(Exchange.HTTP_URI, String.class);
- exchange.getOut().setBody(uri);
- }
- };
- from("jetty:http://localhost:9090/test/hello")
- .to("http://localhost:9080?throwExceptionOnFailure=false&bridgeEndpoint=true");
-
- from("jetty://http://localhost:9080?matchOnUriPrefix=true").process(serviceProc);
+ from("jetty://http://localhost:9080/bye").transform(header("foo").prepend("Bye "));
}
};
}
Modified: camel/trunk/components/camel-jetty/src/test/resources/log4j.properties
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-jetty/src/test/resources/log4j.properties?rev=997262&r1=997261&r2=997262&view=diff
==============================================================================
--- camel/trunk/components/camel-jetty/src/test/resources/log4j.properties (original)
+++ camel/trunk/components/camel-jetty/src/test/resources/log4j.properties Wed Sep 15 10:26:23 2010
@@ -28,6 +28,7 @@ log4j.rootLogger=INFO, file
#log4j.logger.org.apache.camel.component.jetty.CamelContinuationServlet=TRACE
#log4j.logger.org.apache.camel.component.http=TRACE
#log4j.logger.org.apache.camel=DEBUG
+#log4j.logger.org.apache.camel.impl.converter.PropertyEditorTypeConverter=TRACE
# CONSOLE appender not used by default
log4j.appender.out=org.apache.log4j.ConsoleAppender