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 2014/12/18 21:28:10 UTC
[2/5] camel git commit: CAMEL-8113: Optimize type converter registry.
CAMEL-8113: Optimize type converter registry.
Project: http://git-wip-us.apache.org/repos/asf/camel/repo
Commit: http://git-wip-us.apache.org/repos/asf/camel/commit/5cfa913c
Tree: http://git-wip-us.apache.org/repos/asf/camel/tree/5cfa913c
Diff: http://git-wip-us.apache.org/repos/asf/camel/diff/5cfa913c
Branch: refs/heads/master
Commit: 5cfa913c265c7b4b3aaa5d08b7ee7f531071671f
Parents: 9cd39ab
Author: Claus Ibsen <da...@apache.org>
Authored: Thu Dec 18 16:28:11 2014 +0100
Committer: Claus Ibsen <da...@apache.org>
Committed: Thu Dec 18 21:27:57 2014 +0100
----------------------------------------------------------------------
.../apache/camel/builder/ExpressionBuilder.java | 11 ++-
.../apache/camel/component/bean/MethodInfo.java | 9 ++-
.../camel/language/bean/BeanExpression.java | 7 +-
.../apache/camel/support/ExpressionAdapter.java | 4 ++
.../processor/TransformMethodCallTest.java | 48 -------------
...peConverterRegistryStatsPerformanceTest.java | 76 ++++++++++++++++++++
6 files changed, 101 insertions(+), 54 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/camel/blob/5cfa913c/camel-core/src/main/java/org/apache/camel/builder/ExpressionBuilder.java
----------------------------------------------------------------------
diff --git a/camel-core/src/main/java/org/apache/camel/builder/ExpressionBuilder.java b/camel-core/src/main/java/org/apache/camel/builder/ExpressionBuilder.java
index 20f00b9..91c226c 100644
--- a/camel-core/src/main/java/org/apache/camel/builder/ExpressionBuilder.java
+++ b/camel-core/src/main/java/org/apache/camel/builder/ExpressionBuilder.java
@@ -1001,9 +1001,14 @@ public final class ExpressionBuilder {
}
// if its a bean invocation then if it has no arguments then it should be threaded as null body allowed
- BeanInvocation bi = exchange.getIn().getBody(BeanInvocation.class);
- if (bi != null && (bi.getArgs() == null || bi.getArgs().length == 0 || bi.getArgs()[0] == null)) {
- return null;
+ if (exchange.getIn().getBody() instanceof BeanInvocation) {
+ // BeanInvocation would be stored directly as the message body
+ // do not force any type conversion attempts as it would just be unnecessary and cost a bit performance
+ // so a regular instanceof check is sufficient
+ BeanInvocation bi = (BeanInvocation) exchange.getIn().getBody();
+ if (bi.getArgs() == null || bi.getArgs().length == 0 || bi.getArgs()[0] == null) {
+ return null;
+ }
}
}
http://git-wip-us.apache.org/repos/asf/camel/blob/5cfa913c/camel-core/src/main/java/org/apache/camel/component/bean/MethodInfo.java
----------------------------------------------------------------------
diff --git a/camel-core/src/main/java/org/apache/camel/component/bean/MethodInfo.java b/camel-core/src/main/java/org/apache/camel/component/bean/MethodInfo.java
index 9236cd0..aaf3cf0 100644
--- a/camel-core/src/main/java/org/apache/camel/component/bean/MethodInfo.java
+++ b/camel-core/src/main/java/org/apache/camel/component/bean/MethodInfo.java
@@ -594,9 +594,14 @@ public class MethodInfo {
// use object first to avoid type conversion so we know if there is a value or not
Object result = expression.evaluate(exchange, Object.class);
if (result != null) {
- // we got a value now try to convert it to the expected type
try {
- answer = exchange.getContext().getTypeConverter().mandatoryConvertTo(parameterType, result);
+ if (parameterType.isInstance(result)) {
+ // optimize if the value is already the same type
+ answer = result;
+ } else {
+ // we got a value now try to convert it to the expected type
+ answer = exchange.getContext().getTypeConverter().mandatoryConvertTo(parameterType, result);
+ }
if (LOG.isTraceEnabled()) {
LOG.trace("Parameter #{} evaluated as: {} type: ", new Object[]{index, answer, ObjectHelper.type(answer)});
}
http://git-wip-us.apache.org/repos/asf/camel/blob/5cfa913c/camel-core/src/main/java/org/apache/camel/language/bean/BeanExpression.java
----------------------------------------------------------------------
diff --git a/camel-core/src/main/java/org/apache/camel/language/bean/BeanExpression.java b/camel-core/src/main/java/org/apache/camel/language/bean/BeanExpression.java
index 3cbc2fa..f5cc981 100644
--- a/camel-core/src/main/java/org/apache/camel/language/bean/BeanExpression.java
+++ b/camel-core/src/main/java/org/apache/camel/language/bean/BeanExpression.java
@@ -130,7 +130,12 @@ public class BeanExpression implements Expression, Predicate {
public <T> T evaluate(Exchange exchange, Class<T> type) {
Object result = evaluate(exchange);
- return exchange.getContext().getTypeConverter().convertTo(type, exchange, result);
+ if (Object.class == type) {
+ // do not use type converter if type is Object (optimize)
+ return (T) result;
+ } else {
+ return exchange.getContext().getTypeConverter().convertTo(type, exchange, result);
+ }
}
public boolean matches(Exchange exchange) {
http://git-wip-us.apache.org/repos/asf/camel/blob/5cfa913c/camel-core/src/main/java/org/apache/camel/support/ExpressionAdapter.java
----------------------------------------------------------------------
diff --git a/camel-core/src/main/java/org/apache/camel/support/ExpressionAdapter.java b/camel-core/src/main/java/org/apache/camel/support/ExpressionAdapter.java
index d8e43a9..3344eab 100644
--- a/camel-core/src/main/java/org/apache/camel/support/ExpressionAdapter.java
+++ b/camel-core/src/main/java/org/apache/camel/support/ExpressionAdapter.java
@@ -34,6 +34,10 @@ public abstract class ExpressionAdapter extends ExpressionSupport {
public <T> T evaluate(Exchange exchange, Class<T> type) {
Object value = evaluate(exchange);
+ if (Object.class == type) {
+ // do not use type converter if type is Object (optimize)
+ return (T) value;
+ }
return exchange.getContext().getTypeConverter().convertTo(type, exchange, value);
}
http://git-wip-us.apache.org/repos/asf/camel/blob/5cfa913c/camel-core/src/test/java/org/apache/camel/processor/TransformMethodCallTest.java
----------------------------------------------------------------------
diff --git a/camel-core/src/test/java/org/apache/camel/processor/TransformMethodCallTest.java b/camel-core/src/test/java/org/apache/camel/processor/TransformMethodCallTest.java
deleted file mode 100644
index 6144e3c..0000000
--- a/camel-core/src/test/java/org/apache/camel/processor/TransformMethodCallTest.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/**
- * 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.processor;
-
-import org.apache.camel.ContextTestSupport;
-import org.apache.camel.builder.RouteBuilder;
-
-/**
- * @version
- */
-public class TransformMethodCallTest extends ContextTestSupport {
-
- public void testTransform() throws Exception {
- getMockEndpoint("mock:result").expectedBodiesReceived("Hello World");
-
- template.sendBody("direct:start", "World");
-
- assertMockEndpointsSatisfied();
- }
-
- protected RouteBuilder createRouteBuilder() {
- return new RouteBuilder() {
- public void configure() {
- from("direct:start")
- .transform().method(TransformMethodCallTest.class, "transformMe")
- .to("mock:result");
- }
- };
- }
-
- public String transformMe(String in) {
- return "Hello " + in;
- }
-}
http://git-wip-us.apache.org/repos/asf/camel/blob/5cfa913c/camel-core/src/test/java/org/apache/camel/processor/TypeConverterRegistryStatsPerformanceTest.java
----------------------------------------------------------------------
diff --git a/camel-core/src/test/java/org/apache/camel/processor/TypeConverterRegistryStatsPerformanceTest.java b/camel-core/src/test/java/org/apache/camel/processor/TypeConverterRegistryStatsPerformanceTest.java
new file mode 100644
index 0000000..077f0f2
--- /dev/null
+++ b/camel-core/src/test/java/org/apache/camel/processor/TypeConverterRegistryStatsPerformanceTest.java
@@ -0,0 +1,76 @@
+/**
+ * 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.processor;
+
+import org.apache.camel.CamelContext;
+import org.apache.camel.ContextTestSupport;
+import org.apache.camel.builder.RouteBuilder;
+
+/**
+ * @version
+ */
+public class TypeConverterRegistryStatsPerformanceTest extends ContextTestSupport {
+
+ private int size = 1000;
+
+ @Override
+ protected CamelContext createCamelContext() throws Exception {
+ CamelContext context = super.createCamelContext();
+ context.setTypeConverterStatisticsEnabled(true);
+ return context;
+ }
+
+ public void testTransform() throws Exception {
+ long attempt = context.getTypeConverterRegistry().getStatistics().getAttemptCounter();
+ long failed = context.getTypeConverterRegistry().getStatistics().getFailedCounter();
+ long hit = context.getTypeConverterRegistry().getStatistics().getHitCounter();
+ long miss = context.getTypeConverterRegistry().getStatistics().getMissCounter();
+
+ getMockEndpoint("mock:result").expectedMessageCount(size);
+
+ for (int i = 0; i < size; i++) {
+ template.sendBody("direct:start", "World");
+ }
+
+ assertMockEndpointsSatisfied();
+
+ long attempt2 = context.getTypeConverterRegistry().getStatistics().getAttemptCounter();
+ long failed2 = context.getTypeConverterRegistry().getStatistics().getFailedCounter();
+ long hit2 = context.getTypeConverterRegistry().getStatistics().getHitCounter();
+ long miss2 = context.getTypeConverterRegistry().getStatistics().getMissCounter();
+
+ log.info("Attempt: before={}, after={}, delta={}", new Object[]{attempt, attempt2, attempt2 - attempt});
+ log.info("Failed: before={}, after={}, delta={}", new Object[]{failed, failed2, failed2 - failed});
+ log.info("Hit: before={}, after={}, delta={}", new Object[]{hit, hit2, hit2 - hit});
+ log.info("Miss: before={}, after={}, delta={}", new Object[]{miss, miss2, miss2 - miss});
+ }
+
+ protected RouteBuilder createRouteBuilder() {
+ return new RouteBuilder() {
+ public void configure() {
+ from("direct:start")
+ .transform().method(TypeConverterRegistryStatsPerformanceTest.class, "transformMe")
+// .bean(TypeConverterRegistryStatsPerformanceTest.class, "transformMe")
+ .to("mock:result");
+ }
+ };
+ }
+
+ public String transformMe(String in) {
+ return "Hello " + in;
+ }
+}