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