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 2019/05/15 09:03:46 UTC

[camel] 01/11: CAMEL-13501: Component should move initialization logic to doInit instead of doStart

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

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

commit 2f5df13a08b5429ca6d4fadcd01b228c4b9d98ed
Author: Claus Ibsen <cl...@gmail.com>
AuthorDate: Tue May 14 09:39:35 2019 +0200

    CAMEL-13501: Component should move initialization logic to doInit instead of doStart
---
 .../apache/camel/support/service/ServiceSupport.java  | 16 +++++++++++++---
 .../camel/impl/engine/AbstractCamelContext.java       |  7 +++++--
 .../apache/camel/processor/UnitOfWorkProducer.java    |  8 ++++++--
 .../camel/processor/interceptor/DefaultDebugger.java  |  5 -----
 .../apache/camel/language/simple/SimpleLanguage.java  |  8 ++++++--
 .../org/apache/camel/support/ChildServiceSupport.java | 17 +++++++++++++++--
 .../apache/camel/support/ScheduledPollConsumer.java   | 19 +++++++++++++------
 .../camel/support/SynchronousDelegateProducer.java    |  4 ++++
 8 files changed, 62 insertions(+), 22 deletions(-)

diff --git a/core/camel-api/src/main/java/org/apache/camel/support/service/ServiceSupport.java b/core/camel-api/src/main/java/org/apache/camel/support/service/ServiceSupport.java
index e257ac0..5d8d40f 100644
--- a/core/camel-api/src/main/java/org/apache/camel/support/service/ServiceSupport.java
+++ b/core/camel-api/src/main/java/org/apache/camel/support/service/ServiceSupport.java
@@ -56,7 +56,11 @@ public abstract class ServiceSupport implements StatefulService {
             synchronized (lock) {
                 if (status == NEW) {
                     log.trace("Initializing service: {}", this);
-                    doInit();
+                    try {
+                        doInit();
+                    } catch (Exception e) {
+                        throw new RuntimeException("Error initializing service", e);
+                    }
                     status = INITIALIZED;
                 }
             }
@@ -79,7 +83,13 @@ public abstract class ServiceSupport implements StatefulService {
                 log.trace("Service: {} already starting", this);
                 return;
             }
-            init();
+            try {
+                init();
+            } catch (Exception e) {
+                status = FAILED;
+                log.trace("Error while initializing service: " + this, e);
+                throw e;
+            }
             try {
                 status = STARTING;
                 log.trace("Starting service: {}", this);
@@ -304,7 +314,7 @@ public abstract class ServiceSupport implements StatefulService {
      * Initialize the service.
      * This method will only be called once before starting.
      */
-    protected void doInit() {
+    protected void doInit() throws Exception {
     }
 
     /**
diff --git a/core/camel-base/src/main/java/org/apache/camel/impl/engine/AbstractCamelContext.java b/core/camel-base/src/main/java/org/apache/camel/impl/engine/AbstractCamelContext.java
index 29b6ff8..567ab6a 100644
--- a/core/camel-base/src/main/java/org/apache/camel/impl/engine/AbstractCamelContext.java
+++ b/core/camel-base/src/main/java/org/apache/camel/impl/engine/AbstractCamelContext.java
@@ -43,7 +43,6 @@ import java.util.concurrent.atomic.AtomicInteger;
 import java.util.function.Function;
 import java.util.function.Supplier;
 
-import org.apache.camel.AsyncProcessor;
 import org.apache.camel.CamelContext;
 import org.apache.camel.CamelContextAware;
 import org.apache.camel.Component;
@@ -307,7 +306,11 @@ public abstract class AbstractCamelContext extends ServiceSupport implements Cam
         this.startupListeners.add(deferStartupListener);
 
         if (init) {
-            init();
+            try {
+                init();
+            } catch (Exception e) {
+                throw new RuntimeException("Error initializing CamelContext", e);
+            }
         }
     }
 
diff --git a/core/camel-base/src/main/java/org/apache/camel/processor/UnitOfWorkProducer.java b/core/camel-base/src/main/java/org/apache/camel/processor/UnitOfWorkProducer.java
index c3181f7..c406a40 100644
--- a/core/camel-base/src/main/java/org/apache/camel/processor/UnitOfWorkProducer.java
+++ b/core/camel-base/src/main/java/org/apache/camel/processor/UnitOfWorkProducer.java
@@ -55,11 +55,15 @@ public final class UnitOfWorkProducer extends DefaultAsyncProducer {
         return processor.process(exchange, callback);
     }
 
-    public void start() throws Exception {
+    @Override
+    protected void doStart() throws Exception {
+        super.doStart();
         ServiceHelper.startService(processor);
     }
 
-    public void stop() throws Exception {
+    @Override
+    protected void doStop() throws Exception {
+        super.doStop();
         ServiceHelper.stopService(processor);
     }
 
diff --git a/core/camel-base/src/main/java/org/apache/camel/processor/interceptor/DefaultDebugger.java b/core/camel-base/src/main/java/org/apache/camel/processor/interceptor/DefaultDebugger.java
index 0007433..538ebbf 100644
--- a/core/camel-base/src/main/java/org/apache/camel/processor/interceptor/DefaultDebugger.java
+++ b/core/camel-base/src/main/java/org/apache/camel/processor/interceptor/DefaultDebugger.java
@@ -330,11 +330,6 @@ public class DefaultDebugger extends ServiceSupport implements Debugger, CamelCo
     }
 
     @Override
-    public void start() throws Exception {
-        super.start();
-    }
-
-    @Override
     protected void doStart() throws Exception {
         ObjectHelper.notNull(camelContext, "CamelContext", this);
 
diff --git a/core/camel-core/src/main/java/org/apache/camel/language/simple/SimpleLanguage.java b/core/camel-core/src/main/java/org/apache/camel/language/simple/SimpleLanguage.java
index 947efb1..2809e31 100644
--- a/core/camel-core/src/main/java/org/apache/camel/language/simple/SimpleLanguage.java
+++ b/core/camel-core/src/main/java/org/apache/camel/language/simple/SimpleLanguage.java
@@ -118,8 +118,7 @@ public class SimpleLanguage extends LanguageSupport implements StaticService {
     }
 
     @Override
-    @SuppressWarnings("unchecked")
-    public void start() throws Exception {
+    public void init() {
         // setup cache which requires CamelContext to be set first
         if (cacheExpression == null && cachePredicate == null && getCamelContext() != null) {
             int maxSize = CamelContextHelper.getMaximumSimpleCacheSize(getCamelContext());
@@ -134,6 +133,11 @@ public class SimpleLanguage extends LanguageSupport implements StaticService {
     }
 
     @Override
+    public void start() throws Exception {
+        // noop
+    }
+
+    @Override
     public void stop() throws Exception {
         if (cachePredicate instanceof LRUCache) {
             if (LOG.isDebugEnabled()) {
diff --git a/core/camel-support/src/main/java/org/apache/camel/support/ChildServiceSupport.java b/core/camel-support/src/main/java/org/apache/camel/support/ChildServiceSupport.java
index 0f3a3db..fdbc8eb 100644
--- a/core/camel-support/src/main/java/org/apache/camel/support/ChildServiceSupport.java
+++ b/core/camel-support/src/main/java/org/apache/camel/support/ChildServiceSupport.java
@@ -40,9 +40,16 @@ public abstract class ChildServiceSupport extends ServiceSupport {
                 log.trace("Service: {} already starting", this);
                 return;
             }
-            status = STARTING;
-            log.trace("Starting service: {}", this);
             try {
+                initService(childServices);
+            } catch (Exception e) {
+                status = FAILED;
+                log.trace("Error while initializing service: " + this, e);
+                throw e;
+            }
+            try {
+                status = STARTING;
+                log.trace("Starting service: {}", this);
                 ServiceHelper.startService(childServices);
                 doStart();
                 status = STARTED;
@@ -125,4 +132,10 @@ public abstract class ChildServiceSupport extends ServiceSupport {
         return childServices != null && childServices.remove(childService);
     }
 
+    private void initService(List<Service> services) {
+        if (services != null) {
+            services.forEach(Service::init);
+        }
+    }
+
 }
diff --git a/core/camel-support/src/main/java/org/apache/camel/support/ScheduledPollConsumer.java b/core/camel-support/src/main/java/org/apache/camel/support/ScheduledPollConsumer.java
index e90aff3..2bc5e2f 100644
--- a/core/camel-support/src/main/java/org/apache/camel/support/ScheduledPollConsumer.java
+++ b/core/camel-support/src/main/java/org/apache/camel/support/ScheduledPollConsumer.java
@@ -399,8 +399,8 @@ public abstract class ScheduledPollConsumer extends DefaultConsumer implements R
     protected abstract int poll() throws Exception;
 
     @Override
-    protected void doStart() throws Exception {
-        super.doStart();
+    protected void doInit() throws Exception {
+        super.doInit();
 
         // validate that if backoff multiplier is in use, the threshold values is set correctly
         if (backoffMultiplier > 0) {
@@ -415,7 +415,6 @@ public abstract class ScheduledPollConsumer extends DefaultConsumer implements R
         }
         scheduler.setCamelContext(getEndpoint().getCamelContext());
         scheduler.onInit(this);
-        scheduler.scheduleTask(this);
 
         // configure scheduler with options from this consumer
         Map<String, Object> properties = new HashMap<>();
@@ -435,11 +434,19 @@ public abstract class ScheduledPollConsumer extends DefaultConsumer implements R
 
         ObjectHelper.notNull(scheduler, "scheduler", this);
         ObjectHelper.notNull(pollStrategy, "pollStrategy", this);
+    }
 
-        ServiceHelper.startService(scheduler);
+    @Override
+    protected void doStart() throws Exception {
+        super.doStart();
+
+        if (scheduler != null) {
+            scheduler.scheduleTask(this);
+            ServiceHelper.startService(scheduler);
 
-        if (isStartScheduler()) {
-            startScheduler();
+            if (isStartScheduler()) {
+                startScheduler();
+            }
         }
     }
 
diff --git a/core/camel-support/src/main/java/org/apache/camel/support/SynchronousDelegateProducer.java b/core/camel-support/src/main/java/org/apache/camel/support/SynchronousDelegateProducer.java
index 2f99647..6531945 100644
--- a/core/camel-support/src/main/java/org/apache/camel/support/SynchronousDelegateProducer.java
+++ b/core/camel-support/src/main/java/org/apache/camel/support/SynchronousDelegateProducer.java
@@ -46,6 +46,10 @@ public class SynchronousDelegateProducer implements Producer {
         producer.process(exchange);
     }
 
+    public void init() {
+        producer.init();
+    }
+
     public void start() throws Exception {
         producer.start();
     }