This is an automated email from the ASF dual-hosted git repository. davsclaus pushed a commit to branch lazy-exp in repository https://gitbox.apache.org/repos/asf/camel.git
commit 35b80d13f551f9673ccfc923a6bd873458fc9c70 Author: Claus Ibsen <[email protected]> AuthorDate: Mon Sep 16 10:44:02 2024 +0200 CAMEL-21138: camel-jbang - Export should use lazy bean. Only possible for factory method beans such as @Produces --- .../camel/dsl/jbang/core/commands/Export.java | 1 + .../dsl/jbang/core/commands/ExportBaseCommand.java | 7 ++++- .../dsl/jbang/core/commands/ExportCamelMain.java | 2 +- .../dsl/jbang/core/commands/ExportQuarkus.java | 2 +- .../dsl/jbang/core/commands/ExportSpringBoot.java | 2 +- .../apache/camel/dsl/jbang/core/commands/Run.java | 9 ++++++ .../java/org/apache/camel/main/KameletMain.java | 4 ++- .../injection/AnnotationDependencyInjection.java | 35 +++++++++++++++------- 8 files changed, 46 insertions(+), 16 deletions(-) diff --git a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/Export.java b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/Export.java index 70adc51d5df..b12f1515499 100644 --- a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/Export.java +++ b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/Export.java @@ -147,6 +147,7 @@ public class Export extends ExportBaseCommand { cmd.packageName = this.packageName; cmd.excludes = this.excludes; cmd.ignoreLoadingError = this.ignoreLoadingError; + cmd.lazyBean = this.lazyBean; // run export return cmd.export(); } diff --git a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/ExportBaseCommand.java b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/ExportBaseCommand.java index c50b50ccf2d..1acc9dc7a2e 100644 --- a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/ExportBaseCommand.java +++ b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/ExportBaseCommand.java @@ -218,6 +218,10 @@ public abstract class ExportBaseCommand extends CamelCommand { description = "Whether to ignore route loading and compilation errors (use this with care!)") protected boolean ignoreLoadingError; + @CommandLine.Option(names = { "--lazy-bean" }, + description = "Whether to use lazy bean initialization (can help with complex classloading issues") + protected boolean lazyBean; + protected boolean symbolicLink; // copy source files using symbolic link protected boolean javaLiveReload; // reload java codes in dev @@ -296,7 +300,7 @@ public abstract class ExportBaseCommand extends CamelCommand { return null; } - protected Integer runSilently(boolean ignoreLoadingError) throws Exception { + protected Integer runSilently(boolean ignoreLoadingError, boolean lazyBean) throws Exception { Run run = new Run(getMain()); // need to declare the profile to use for run run.dependencies = dependencies; @@ -311,6 +315,7 @@ public abstract class ExportBaseCommand extends CamelCommand { run.kameletsVersion = kameletsVersion; run.localKameletDir = localKameletDir; run.ignoreLoadingError = ignoreLoadingError; + run.lazyBean = lazyBean; return run.runExport(ignoreLoadingError); } diff --git a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/ExportCamelMain.java b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/ExportCamelMain.java index d47a5b35c1f..709552d1e10 100644 --- a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/ExportCamelMain.java +++ b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/ExportCamelMain.java @@ -65,7 +65,7 @@ class ExportCamelMain extends Export { if (!quiet && fresh) { printer().println("Generating fresh run data"); } - int silent = runSilently(ignoreLoadingError); + int silent = runSilently(ignoreLoadingError, lazyBean); if (silent != 0) { return silent; } diff --git a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/ExportQuarkus.java b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/ExportQuarkus.java index 4c2fa09585d..88914af1179 100644 --- a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/ExportQuarkus.java +++ b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/ExportQuarkus.java @@ -69,7 +69,7 @@ class ExportQuarkus extends Export { if (!quiet) { printer().println("Generating fresh run data"); } - int silent = runSilently(ignoreLoadingError); + int silent = runSilently(ignoreLoadingError, lazyBean); if (silent != 0) { return silent; } diff --git a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/ExportSpringBoot.java b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/ExportSpringBoot.java index 07cbe64ff9d..72979ac35b9 100644 --- a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/ExportSpringBoot.java +++ b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/ExportSpringBoot.java @@ -67,7 +67,7 @@ class ExportSpringBoot extends Export { if (!quiet) { printer().println("Generating fresh run data"); } - int silent = runSilently(ignoreLoadingError); + int silent = runSilently(ignoreLoadingError, lazyBean); if (silent != 0) { return silent; } diff --git a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/Run.java b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/Run.java index 02e49777bdd..8aa6b5c4d85 100644 --- a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/Run.java +++ b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/Run.java @@ -283,6 +283,10 @@ public class Run extends CamelCommand { description = "Whether to ignore route loading and compilation errors (use this with care!)") protected boolean ignoreLoadingError; + @Option(names = { "--lazy-bean" }, + description = "Whether to use lazy bean initialization (can help with complex classloading issues") + protected boolean lazyBean; + @Option(names = { "--prompt" }, description = "Allow user to type in required parameters in prompt if not present in application") boolean prompt; @@ -529,6 +533,9 @@ public class Run extends CamelCommand { if (ignoreLoadingError) { writeSetting(main, profileProperties, "camel.jbang.ignoreLoadingError", "true"); } + if (lazyBean) { + writeSetting(main, profileProperties, "camel.jbang.lazyBean", "true"); + } if (prompt) { writeSetting(main, profileProperties, "camel.jbang.prompt", "true"); } @@ -892,6 +899,7 @@ public class Run extends CamelCommand { eq.logging = false; eq.loggingLevel = "off"; eq.ignoreLoadingError = this.ignoreLoadingError; + eq.lazyBean = this.lazyBean; // run export int exit = eq.export(); @@ -966,6 +974,7 @@ public class Run extends CamelCommand { eq.logging = false; eq.loggingLevel = "off"; eq.ignoreLoadingError = this.ignoreLoadingError; + eq.lazyBean = this.lazyBean; // run export int exit = eq.export(); diff --git a/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/KameletMain.java b/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/KameletMain.java index f15786c1c65..75e5416ae1f 100644 --- a/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/KameletMain.java +++ b/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/KameletMain.java @@ -477,7 +477,9 @@ public class KameletMain extends MainCommandLineSupport { // load camel component and custom health-checks answer.setLoadHealthChecks(true); // annotation based dependency injection for camel/spring/quarkus annotations in DSLs and Java beans - AnnotationDependencyInjection.initAnnotationBasedDependencyInjection(answer); + + boolean lazyBean = "true".equals(getInitialProperties().get("camel.jbang.lazyBean")); + new AnnotationDependencyInjection(answer, lazyBean); if (!silent) { // silent should not include cli-connector diff --git a/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/injection/AnnotationDependencyInjection.java b/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/injection/AnnotationDependencyInjection.java index 0479ba6d14b..b50d08ee707 100644 --- a/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/injection/AnnotationDependencyInjection.java +++ b/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/injection/AnnotationDependencyInjection.java @@ -61,10 +61,11 @@ import org.springframework.stereotype.Service; */ public final class AnnotationDependencyInjection { - private AnnotationDependencyInjection() { - } + private final boolean lazyBean; + + public AnnotationDependencyInjection(CamelContext context, boolean lazyBean) { + this.lazyBean = lazyBean; - public static void initAnnotationBasedDependencyInjection(CamelContext context) { Registry registry = context.getRegistry(); CamelBeanPostProcessor cbbp = PluginHelper.getBeanPostProcessor(context); @@ -132,7 +133,7 @@ public final class AnnotationDependencyInjection { } } - private static class BindToRegistryCompilePostProcessor implements CompilePostProcessor { + private class BindToRegistryCompilePostProcessor implements CompilePostProcessor { @Override public void postCompile(CamelContext camelContext, String name, Class<?> clazz, byte[] byteCode, Object instance) @@ -142,7 +143,7 @@ public final class AnnotationDependencyInjection { Configuration cfg = clazz.getAnnotation(Configuration.class); // special for lazy beans which we must create on-demand - if (instance == null && bir != null && bir.lazy()) { + if (instance == null && bir != null && (lazyBean || bir.lazy())) { final String beanName = bir.value(); instance = (Supplier<Object>) () -> { Object answer = camelContext.getInjector().newInstance(clazz); @@ -189,7 +190,7 @@ public final class AnnotationDependencyInjection { } - private static class SpringAnnotationCompilePostProcessor implements CompilePostProcessor { + private class SpringAnnotationCompilePostProcessor implements CompilePostProcessor { @Override public void postCompile(CamelContext camelContext, String name, Class<?> clazz, byte[] byteCode, Object instance) @@ -211,7 +212,7 @@ public final class AnnotationDependencyInjection { } } - private static class SpringBeanPostProcessorInjector implements CamelBeanPostProcessorInjector { + private class SpringBeanPostProcessorInjector implements CamelBeanPostProcessorInjector { private final CamelContext context; private final CamelPostProcessorHelper helper; @@ -252,7 +253,13 @@ public final class AnnotationDependencyInjection { public void onMethodInject(Method method, Object bean, String beanName) { Bean bi = method.getAnnotation(Bean.class); if (bi != null) { - Object instance = helper.getInjectionBeanMethodValue(context, method, bean, beanName, "Bean"); + Object instance; + if (lazyBean) { + instance = (Supplier<Object>) () -> helper.getInjectionBeanMethodValue(context, method, bean, beanName, + "Bean"); + } else { + instance = helper.getInjectionBeanMethodValue(context, method, bean, beanName, "Bean"); + } if (instance != null) { String name = method.getName(); if (bi.name().length > 0) { @@ -264,7 +271,7 @@ public final class AnnotationDependencyInjection { } } - private static class QuarkusAnnotationCompilePostProcessor implements CompilePostProcessor { + private class QuarkusAnnotationCompilePostProcessor implements CompilePostProcessor { @Override public void postCompile(CamelContext camelContext, String name, Class<?> clazz, byte[] byteCode, Object instance) @@ -285,7 +292,7 @@ public final class AnnotationDependencyInjection { } } - private static class QuarkusBeanPostProcessorInjector implements CamelBeanPostProcessorInjector { + private class QuarkusBeanPostProcessorInjector implements CamelBeanPostProcessorInjector { private final CamelContext context; private final CamelPostProcessorHelper helper; @@ -324,7 +331,13 @@ public final class AnnotationDependencyInjection { Produces produces = method.getAnnotation(Produces.class); Named bi = method.getAnnotation(Named.class); if (produces != null || bi != null) { - Object instance = helper.getInjectionBeanMethodValue(context, method, bean, beanName, "Produces"); + Object instance; + if (lazyBean) { + instance = (Supplier<Object>) () -> helper.getInjectionBeanMethodValue(context, method, bean, beanName, + "Produces"); + } else { + instance = helper.getInjectionBeanMethodValue(context, method, bean, beanName, "Produces"); + } if (instance != null) { String name = method.getName(); if (bi != null && !bi.value().isBlank()) {
