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 2017/06/30 07:55:52 UTC
[2/2] camel git commit: CAMEL-11484: Optimise - Simple Language /
ExpressionBuilder can use cache of frequent used expressions when having
nested functions
CAMEL-11484: Optimise - Simple Language / ExpressionBuilder can use cache of frequent used expressions when having nested functions
Project: http://git-wip-us.apache.org/repos/asf/camel/repo
Commit: http://git-wip-us.apache.org/repos/asf/camel/commit/52cede01
Tree: http://git-wip-us.apache.org/repos/asf/camel/tree/52cede01
Diff: http://git-wip-us.apache.org/repos/asf/camel/diff/52cede01
Branch: refs/heads/master
Commit: 52cede0162ee1a2b81a70ed0ee220d1edf446bb8
Parents: b8f7e42
Author: Claus Ibsen <da...@apache.org>
Authored: Fri Jun 30 09:41:01 2017 +0200
Committer: Claus Ibsen <da...@apache.org>
Committed: Fri Jun 30 09:45:25 2017 +0200
----------------------------------------------------------------------
.../apache/camel/impl/DefaultCamelContext.java | 3 ++
.../camel/language/simple/SimpleLanguage.java | 48 ++++++++++++++------
.../camel/language/LanguageServiceTest.java | 12 +++--
3 files changed, 46 insertions(+), 17 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/camel/blob/52cede01/camel-core/src/main/java/org/apache/camel/impl/DefaultCamelContext.java
----------------------------------------------------------------------
diff --git a/camel-core/src/main/java/org/apache/camel/impl/DefaultCamelContext.java b/camel-core/src/main/java/org/apache/camel/impl/DefaultCamelContext.java
index 4cb46f4..26a865d 100644
--- a/camel-core/src/main/java/org/apache/camel/impl/DefaultCamelContext.java
+++ b/camel-core/src/main/java/org/apache/camel/impl/DefaultCamelContext.java
@@ -3933,6 +3933,9 @@ public class DefaultCamelContext extends ServiceSupport implements ModelCamelCon
if (isTypeConverterStatisticsEnabled() != null) {
getTypeConverterRegistry().getStatistics().setStatisticsEnabled(isTypeConverterStatisticsEnabled());
}
+
+ // resolve simple language to initialize it
+ resolveLanguage("simple");
}
/**
http://git-wip-us.apache.org/repos/asf/camel/blob/52cede01/camel-core/src/main/java/org/apache/camel/language/simple/SimpleLanguage.java
----------------------------------------------------------------------
diff --git a/camel-core/src/main/java/org/apache/camel/language/simple/SimpleLanguage.java b/camel-core/src/main/java/org/apache/camel/language/simple/SimpleLanguage.java
index ab0aa36..d62e909 100644
--- a/camel-core/src/main/java/org/apache/camel/language/simple/SimpleLanguage.java
+++ b/camel-core/src/main/java/org/apache/camel/language/simple/SimpleLanguage.java
@@ -16,16 +16,17 @@
*/
package org.apache.camel.language.simple;
-import org.apache.camel.CamelContext;
-import org.apache.camel.Exchange;
import org.apache.camel.Expression;
import org.apache.camel.Predicate;
+import org.apache.camel.StaticService;
import org.apache.camel.builder.ExpressionBuilder;
import org.apache.camel.support.LanguageSupport;
import org.apache.camel.util.CamelContextHelper;
import org.apache.camel.util.LRUCache;
import org.apache.camel.util.ObjectHelper;
import org.apache.camel.util.PredicateToExpressionAdapter;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
/**
* A <a href="http://camel.apache.org/simple.html">simple language</a>
@@ -90,19 +91,20 @@ import org.apache.camel.util.PredicateToExpressionAdapter;
* return the full path including the starting directory.
* <br/>
* The <b>only</b> file is the filename only with all paths clipped.
- *
*/
-public class SimpleLanguage extends LanguageSupport {
+public class SimpleLanguage extends LanguageSupport implements StaticService {
+
+ private static final Logger LOG = LoggerFactory.getLogger(SimpleLanguage.class);
// singleton for expressions without a result type
private static final SimpleLanguage SIMPLE = new SimpleLanguage();
+ boolean allowEscape = true;
+
// use caches to avoid re-parsing the same expressions over and over again
private LRUCache<String, Expression> cacheExpression;
private LRUCache<String, Predicate> cachePredicate;
- protected boolean allowEscape = true;
-
/**
* Default constructor.
*/
@@ -110,14 +112,33 @@ public class SimpleLanguage extends LanguageSupport {
}
@Override
- public void setCamelContext(CamelContext camelContext) {
- super.setCamelContext(camelContext);
-
+ public void start() throws Exception {
// setup cache which requires CamelContext to be set first
- if (cacheExpression == null && cachePredicate == null && camelContext != null) {
- int maxSize = CamelContextHelper.getMaximumSimpleCacheSize(camelContext);
- cacheExpression = new LRUCache<>(16, maxSize, false);
- cachePredicate = new LRUCache<>(16, maxSize, false);
+ if (cacheExpression == null && cachePredicate == null && getCamelContext() != null) {
+ int maxSize = CamelContextHelper.getMaximumSimpleCacheSize(getCamelContext());
+ if (maxSize > 0) {
+ cacheExpression = new LRUCache<>(16, maxSize, false);
+ cachePredicate = new LRUCache<>(16, maxSize, false);
+ LOG.debug("Simple language predicate/expression cache size: {}", maxSize);
+ } else {
+ LOG.debug("Simple language disabled predicate/expression cache");
+ }
+ }
+ }
+
+ @Override
+ public void stop() throws Exception {
+ if (cachePredicate != null) {
+ if (LOG.isDebugEnabled()) {
+ LOG.debug("Clearing simple language predicate cache[size={}, hits={}, misses={}, evicted={}]",
+ cachePredicate.size(), cachePredicate.getHits(), cachePredicate.getMisses(), cachePredicate.getEvicted());
+ }
+ }
+ if (cacheExpression != null) {
+ if (LOG.isDebugEnabled()) {
+ LOG.debug("Clearing simple language expression cache[size={}, hits={}, misses={}, evicted={}]",
+ cacheExpression.size(), cacheExpression.getHits(), cacheExpression.getMisses(), cacheExpression.getEvicted());
+ }
}
}
@@ -283,4 +304,5 @@ public class SimpleLanguage extends LanguageSupport {
public void setFunctionEndToken(String endToken) {
changeFunctionEndToken(endToken);
}
+
}
http://git-wip-us.apache.org/repos/asf/camel/blob/52cede01/camel-core/src/test/java/org/apache/camel/language/LanguageServiceTest.java
----------------------------------------------------------------------
diff --git a/camel-core/src/test/java/org/apache/camel/language/LanguageServiceTest.java b/camel-core/src/test/java/org/apache/camel/language/LanguageServiceTest.java
index e87b775..6edfb9f 100644
--- a/camel-core/src/test/java/org/apache/camel/language/LanguageServiceTest.java
+++ b/camel-core/src/test/java/org/apache/camel/language/LanguageServiceTest.java
@@ -41,14 +41,16 @@ public class LanguageServiceTest extends ContextTestSupport {
MyLanguage myl = (MyLanguage) context.resolveLanguage("my");
assertNotNull(myl);
assertEquals("Started", myl.getState());
- assertEquals(1, context.getLanguageNames().size());
+ // simple language is resolved by default hence why there is 2
+ assertEquals(2, context.getLanguageNames().size());
// resolve again, should find same instance
MyLanguage myl2 = (MyLanguage) context.resolveLanguage("my");
assertNotNull(myl2);
assertSame(myl, myl2);
assertEquals("Started", myl2.getState());
- assertEquals(1, context.getLanguageNames().size());
+ // simple language is resolved by default hence why there is 2
+ assertEquals(2, context.getLanguageNames().size());
context.stop();
assertEquals("Stopped", myl.getState());
@@ -58,13 +60,15 @@ public class LanguageServiceTest extends ContextTestSupport {
public void testNonSingletonLanguage() throws Exception {
Language tol = context.resolveLanguage("tokenize");
assertNotNull(tol);
- assertEquals(1, context.getLanguageNames().size());
+ // simple language is resolved by default hence why there is 2
+ assertEquals(2, context.getLanguageNames().size());
// resolve again, should find another instance
Language tol2 = context.resolveLanguage("tokenize");
assertNotNull(tol2);
assertNotSame(tol, tol2);
- assertEquals(1, context.getLanguageNames().size());
+ // simple language is resolved by default hence why there is 2
+ assertEquals(2, context.getLanguageNames().size());
context.stop();
assertTrue(context.getLanguageNames().isEmpty());