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 2022/08/27 09:31:58 UTC

[camel-spring-boot] 02/02: CAMEL-18425: camel-cli - Make regular Camel applications work with Camel CLI

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

davsclaus pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/camel-spring-boot.git

commit a391f64eeed93349061fa298792c400cfe6860b5
Author: Claus Ibsen <cl...@gmail.com>
AuthorDate: Sat Aug 27 11:11:01 2022 +0200

    CAMEL-18425: camel-cli - Make regular Camel applications work with Camel CLI
---
 .../connector/CliConnectorAutoConfiguration.java   |  6 ++---
 .../camel/spring/boot/CamelAutoConfiguration.java  | 26 ++++++++++++++++++++++
 2 files changed, 28 insertions(+), 4 deletions(-)

diff --git a/components-starter/camel-cli-connector-starter/src/main/java/org/apache/camel/springboot/cli/connector/CliConnectorAutoConfiguration.java b/components-starter/camel-cli-connector-starter/src/main/java/org/apache/camel/springboot/cli/connector/CliConnectorAutoConfiguration.java
index c3ca214dd29..267c0066455 100644
--- a/components-starter/camel-cli-connector-starter/src/main/java/org/apache/camel/springboot/cli/connector/CliConnectorAutoConfiguration.java
+++ b/components-starter/camel-cli-connector-starter/src/main/java/org/apache/camel/springboot/cli/connector/CliConnectorAutoConfiguration.java
@@ -23,8 +23,7 @@ import java.util.jar.Manifest;
 
 import org.apache.camel.spi.CliConnectorFactory;
 import org.springframework.boot.SpringBootVersion;
-import org.springframework.boot.autoconfigure.AutoConfigureAfter;
-import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
+import org.springframework.boot.autoconfigure.AutoConfigureBefore;
 import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
 import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
 import org.springframework.boot.context.properties.EnableConfigurationProperties;
@@ -34,8 +33,7 @@ import org.springframework.context.support.AbstractApplicationContext;
 
 @Configuration(proxyBeanMethods = false)
 @ConditionalOnProperty(name = "camel.cli.enabled", matchIfMissing = true)
-@ConditionalOnBean(type = "org.apache.camel.spring.boot.CamelAutoConfiguration")
-@AutoConfigureAfter(name = "org.apache.camel.spring.boot.CamelAutoConfiguration")
+@AutoConfigureBefore(name = "org.apache.camel.spring.boot.CamelAutoConfiguration") // configure early to have Camel CLI during startup
 @EnableConfigurationProperties({CliConnectorConfiguration.class})
 public class CliConnectorAutoConfiguration {
 
diff --git a/core/camel-spring-boot/src/main/java/org/apache/camel/spring/boot/CamelAutoConfiguration.java b/core/camel-spring-boot/src/main/java/org/apache/camel/spring/boot/CamelAutoConfiguration.java
index c2c846edb93..9270c586ac9 100644
--- a/core/camel-spring-boot/src/main/java/org/apache/camel/spring/boot/CamelAutoConfiguration.java
+++ b/core/camel-spring-boot/src/main/java/org/apache/camel/spring/boot/CamelAutoConfiguration.java
@@ -26,20 +26,25 @@ import org.apache.camel.ConsumerTemplate;
 import org.apache.camel.ExtendedCamelContext;
 import org.apache.camel.FluentProducerTemplate;
 import org.apache.camel.ProducerTemplate;
+import org.apache.camel.RuntimeCamelException;
 import org.apache.camel.component.properties.PropertiesComponent;
 import org.apache.camel.component.properties.PropertiesParser;
 import org.apache.camel.main.DefaultConfigurationConfigurer;
 import org.apache.camel.main.RoutesCollector;
 import org.apache.camel.model.Model;
 import org.apache.camel.spi.BeanRepository;
+import org.apache.camel.spi.CliConnector;
+import org.apache.camel.spi.CliConnectorFactory;
 import org.apache.camel.spi.StartupStepRecorder;
 import org.apache.camel.spring.spi.ApplicationContextBeanRepository;
 import org.apache.camel.spring.spi.CamelBeanPostProcessor;
 import org.apache.camel.support.DefaultRegistry;
+import org.apache.camel.support.service.ServiceHelper;
 import org.apache.camel.support.startup.LoggingStartupStepRecorder;
 import org.apache.camel.util.ObjectHelper;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
+import org.springframework.beans.BeansException;
 import org.springframework.beans.factory.config.BeanDefinition;
 import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
 import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingClass;
@@ -126,6 +131,9 @@ public class CamelAutoConfiguration {
             }
         }
 
+        // setup cli connector eager
+        configureCliConnector(applicationContext, camelContext);
+
         camelContext.adapt(ExtendedCamelContext.class).setPackageScanClassResolver(new FatJarPackageScanClassResolver());
         camelContext.adapt(ExtendedCamelContext.class).setPackageScanResourceResolver(new FatJarPackageScanResourceResolver());
 
@@ -144,6 +152,24 @@ public class CamelAutoConfiguration {
         return camelContext;
     }
 
+    static void configureCliConnector(ApplicationContext applicationContext,
+                                      CamelContext camelContext) {
+
+        // factory is bound eager into spring bean registry
+        try {
+            CliConnectorFactory ccf = applicationContext.getBean(CliConnectorFactory.class);
+            CliConnector connector = ccf.createConnector();
+            camelContext.addService(connector, true);
+            // force start cli connector early as otherwise it will be deferred until context is started
+            // but, we want status available during startup phase
+            ServiceHelper.startService(connector);
+        } catch (BeansException e) {
+            // optional so ignore
+        } catch (Exception e) {
+            throw RuntimeCamelException.wrapRuntimeException(e);
+        }
+    }
+
     static void configureStartupRecorder(CamelContext camelContext, CamelConfigurationProperties config) {
         if ("false".equals(config.getStartupRecorder())) {
             camelContext.adapt(ExtendedCamelContext.class).getStartupStepRecorder().setEnabled(false);