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 2020/10/12 07:03:11 UTC

[camel] branch master updated: CAMEL-15669: Fixed camel-cloud may hang if service registry is empty during service call EIP.

This is an automated email from the ASF dual-hosted git repository.

davsclaus pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/camel.git


The following commit(s) were added to refs/heads/master by this push:
     new e03054d  CAMEL-15669: Fixed camel-cloud may hang if service registry is empty during service call EIP.
e03054d is described below

commit e03054d49e9b5a8a149ba658692e8938f6023479
Author: Claus Ibsen <cl...@gmail.com>
AuthorDate: Mon Oct 12 09:01:05 2020 +0200

    CAMEL-15669: Fixed camel-cloud may hang if service registry is empty during service call EIP.
---
 .../impl/cloud/DefaultServiceCallProcessor.java    | 39 ++++++++++------------
 1 file changed, 18 insertions(+), 21 deletions(-)

diff --git a/core/camel-cloud/src/main/java/org/apache/camel/impl/cloud/DefaultServiceCallProcessor.java b/core/camel-cloud/src/main/java/org/apache/camel/impl/cloud/DefaultServiceCallProcessor.java
index b00bd4b..0e756db 100644
--- a/core/camel-cloud/src/main/java/org/apache/camel/impl/cloud/DefaultServiceCallProcessor.java
+++ b/core/camel-cloud/src/main/java/org/apache/camel/impl/cloud/DefaultServiceCallProcessor.java
@@ -54,8 +54,12 @@ public class DefaultServiceCallProcessor extends AsyncProcessorSupport {
     private final Expression expression;
     private AsyncProcessor processor;
 
-    public DefaultServiceCallProcessor(
-                                       CamelContext camelContext, String name, String scheme, String uri,
+    private Expression serviceNameExp;
+    private Expression serviceUriExp;
+    private Expression servicePathExp;
+    private Expression serviceSchemeExp;
+
+    public DefaultServiceCallProcessor(CamelContext camelContext, String name, String scheme, String uri,
                                        ExchangePattern exchangePattern,
                                        ServiceLoadBalancer loadBalancer, Expression expression) {
 
@@ -138,6 +142,13 @@ public class DefaultServiceCallProcessor extends AsyncProcessorSupport {
         Processor send = camelContext.adapt(ExtendedCamelContext.class).getProcessorFactory().createProcessor(camelContext,
                 "SendDynamicProcessor", args);
         processor = AsyncProcessorConverterHelper.convert(send);
+
+        // optimize and build expressions that are static ahead of time
+        Language simple = camelContext.resolveLanguage("simple");
+        serviceNameExp = simple.createExpression(name);
+        serviceUriExp = uri != null ? simple.createExpression(uri) : null;
+        servicePathExp = contextPath != null ? simple.createExpression(contextPath) : null;
+        serviceSchemeExp = scheme != null ? simple.createExpression(scheme) : null;
     }
 
     @Override
@@ -163,10 +174,10 @@ public class DefaultServiceCallProcessor extends AsyncProcessorSupport {
         final Message message = exchange.getIn();
 
         // the values can be dynamic using simple language so compute those
-        final String serviceName = applySimpleLanguage(name, exchange);
-        final String serviceUri = applySimpleLanguage(uri, exchange);
-        final String servicePath = applySimpleLanguage(contextPath, exchange);
-        final String serviceScheme = applySimpleLanguage(scheme, exchange);
+        final String serviceName = serviceNameExp.evaluate(exchange, String.class);
+        final String serviceUri = serviceUriExp != null ? serviceUriExp.evaluate(exchange, String.class) : null;
+        final String servicePath = servicePathExp != null ? servicePathExp.evaluate(exchange, String.class) : null;
+        final String serviceScheme = serviceSchemeExp != null ? serviceSchemeExp.evaluate(exchange, String.class) : null;
 
         message.setHeader(ServiceCallConstants.SERVICE_CALL_URI, serviceUri);
         message.setHeader(ServiceCallConstants.SERVICE_CALL_CONTEXT_PATH, servicePath);
@@ -177,6 +188,7 @@ public class DefaultServiceCallProcessor extends AsyncProcessorSupport {
             return loadBalancer.process(serviceName, server -> execute(server, exchange, callback));
         } catch (Exception e) {
             exchange.setException(e);
+            callback.done(true);
             return true;
         }
     }
@@ -209,19 +221,4 @@ public class DefaultServiceCallProcessor extends AsyncProcessorSupport {
         return processor.process(exchange, callback);
     }
 
-    /**
-     * This function applies the simple language to the given expression.
-     *
-     * @param  expression the expression
-     * @param  exchange   the exchange
-     * @return            the computed expression
-     */
-    private static String applySimpleLanguage(String expression, Exchange exchange) {
-        if (expression != null) {
-            Language simple = exchange.getContext().resolveLanguage("simple");
-            return simple.createExpression(expression).evaluate(exchange, String.class);
-        } else {
-            return null;
-        }
-    }
 }