This is an automated email from the ASF dual-hosted git repository. davsclaus pushed a commit to branch init-destroy in repository https://gitbox.apache.org/repos/asf/camel.git
commit 388df9193a519e804300ddd3f29be52a173686e2 Author: Claus Ibsen <claus.ib...@gmail.com> AuthorDate: Thu Aug 29 13:30:51 2024 +0200 CAMEL-21140: camel-core - Add init/destroy method support for registry bind --- .../camel/dsl/xml/io/XmlRoutesBuilderLoader.java | 45 +-------------------- .../dsl/yaml/deserializers/BeansDeserializer.java | 46 +--------------------- .../dsl/yaml/YamlRoutesBuilderLoaderSupport.java | 4 -- 3 files changed, 4 insertions(+), 91 deletions(-) diff --git a/dsl/camel-xml-io-dsl/src/main/java/org/apache/camel/dsl/xml/io/XmlRoutesBuilderLoader.java b/dsl/camel-xml-io-dsl/src/main/java/org/apache/camel/dsl/xml/io/XmlRoutesBuilderLoader.java index c3d54777676..95a5292a31f 100644 --- a/dsl/camel-xml-io-dsl/src/main/java/org/apache/camel/dsl/xml/io/XmlRoutesBuilderLoader.java +++ b/dsl/camel-xml-io-dsl/src/main/java/org/apache/camel/dsl/xml/io/XmlRoutesBuilderLoader.java @@ -18,7 +18,6 @@ package org.apache.camel.dsl.xml.io; import java.io.IOException; import java.util.ArrayList; -import java.util.LinkedHashMap; import java.util.LinkedHashSet; import java.util.List; import java.util.Map; @@ -51,9 +50,7 @@ import org.apache.camel.model.rest.RestsDefinition; import org.apache.camel.spi.Resource; import org.apache.camel.spi.annotations.RoutesLoader; import org.apache.camel.support.CachedResource; -import org.apache.camel.support.ObjectHelper; import org.apache.camel.support.scan.PackageScanHelper; -import org.apache.camel.util.KeyValueHolder; import org.apache.camel.xml.io.util.XmlStreamDetector; import org.apache.camel.xml.io.util.XmlStreamInfo; import org.slf4j.Logger; @@ -72,7 +69,6 @@ public class XmlRoutesBuilderLoader extends RouteBuilderLoaderSupport { private final Map<String, XmlStreamInfo> xmlInfoCache = new ConcurrentHashMap<>(); private final Map<String, BeansDefinition> camelAppCache = new ConcurrentHashMap<>(); private final List<BeanFactoryDefinition<?>> delayedRegistrations = new ArrayList<>(); - private final Map<String, KeyValueHolder<Object, String>> beansToDestroy = new LinkedHashMap<>(); private final AtomicInteger counter = new AtomicInteger(0); @@ -364,50 +360,13 @@ public class XmlRoutesBuilderLoader extends RouteBuilderLoaderSupport { } protected void bindBean(BeanFactoryDefinition<?> def, String name, Object target) throws Exception { - // destroy and unbind any existing bean - destroyBean(name, true); + // unbind in case we reload getCamelContext().getRegistry().unbind(name); - - // invoke init method and register bean - String initMethod = def.getInitMethod(); - if (initMethod != null) { - ObjectHelper.invokeMethodSafe(initMethod, target); - } - getCamelContext().getRegistry().bind(name, target); - - // remember to destroy bean on shutdown - if (def.getDestroyMethod() != null) { - beansToDestroy.put(name, new KeyValueHolder<>(target, def.getDestroyMethod())); - } + getCamelContext().getRegistry().bind(name, target, def.getInitMethod(), def.getDestroyMethod()); // register bean in model Model model = getCamelContext().getCamelContextExtension().getContextPlugin(Model.class); model.addCustomBean(def); } - protected void destroyBean(String name, boolean remove) { - var holder = remove ? beansToDestroy.remove(name) : beansToDestroy.get(name); - if (holder != null) { - String destroyMethod = holder.getValue(); - Object target = holder.getKey(); - try { - ObjectHelper.invokeMethodSafe(destroyMethod, target); - } catch (Exception e) { - LOG.warn("Error invoking destroy method: {} on bean: {} due to: {}. This exception is ignored.", - destroyMethod, target, e.getMessage(), e); - } - } - } - - @Override - protected void doStop() throws Exception { - super.doStop(); - - // beans should trigger destroy methods on shutdown - for (String name : beansToDestroy.keySet()) { - destroyBean(name, false); - } - beansToDestroy.clear(); - } - } diff --git a/dsl/camel-yaml-dsl/camel-yaml-dsl-deserializers/src/main/java/org/apache/camel/dsl/yaml/deserializers/BeansDeserializer.java b/dsl/camel-yaml-dsl/camel-yaml-dsl-deserializers/src/main/java/org/apache/camel/dsl/yaml/deserializers/BeansDeserializer.java index 7c54470cc62..9b5001d5428 100644 --- a/dsl/camel-yaml-dsl/camel-yaml-dsl-deserializers/src/main/java/org/apache/camel/dsl/yaml/deserializers/BeansDeserializer.java +++ b/dsl/camel-yaml-dsl/camel-yaml-dsl-deserializers/src/main/java/org/apache/camel/dsl/yaml/deserializers/BeansDeserializer.java @@ -18,9 +18,7 @@ package org.apache.camel.dsl.yaml.deserializers; import java.util.ArrayList; import java.util.HashSet; -import java.util.LinkedHashMap; import java.util.List; -import java.util.Map; import java.util.Set; import org.apache.camel.CamelContext; @@ -34,10 +32,7 @@ import org.apache.camel.spi.CamelContextCustomizer; import org.apache.camel.spi.annotations.YamlIn; import org.apache.camel.spi.annotations.YamlProperty; import org.apache.camel.spi.annotations.YamlType; -import org.apache.camel.util.KeyValueHolder; import org.apache.camel.util.ObjectHelper; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; import org.snakeyaml.engine.v2.api.ConstructNode; import org.snakeyaml.engine.v2.nodes.Node; import org.snakeyaml.engine.v2.nodes.SequenceNode; @@ -52,10 +47,7 @@ import org.snakeyaml.engine.v2.nodes.SequenceNode; }) public class BeansDeserializer extends YamlDeserializerSupport implements ConstructNode { - public static final Logger LOG = LoggerFactory.getLogger(BeansDeserializer.class); - private final Set<String> beanCache = new HashSet<>(); - private final Map<String, KeyValueHolder<Object, String>> beansToDestroy = new LinkedHashMap<>(); @Override public Object construct(Node node) { @@ -149,47 +141,13 @@ public class BeansDeserializer extends YamlDeserializerSupport implements Constr String name, Object target) throws Exception { - // destroy and unbind any existing bean - destroyBean(name, true); + // unbind in case we reload camelContext.getRegistry().unbind(name); - - // invoke init method and register bean - String initMethod = def.getInitMethod(); - if (initMethod != null) { - org.apache.camel.support.ObjectHelper.invokeMethodSafe(initMethod, target); - } - camelContext.getRegistry().bind(name, target); - - // remember to destroy bean on shutdown - if (def.getDestroyMethod() != null) { - beansToDestroy.put(name, new KeyValueHolder<>(target, def.getDestroyMethod())); - } + camelContext.getRegistry().bind(name, target, def.getInitMethod(), def.getDestroyMethod()); // register bean in model Model model = camelContext.getCamelContextExtension().getContextPlugin(Model.class); model.addCustomBean(def); } - protected void destroyBean(String name, boolean remove) { - var holder = remove ? beansToDestroy.remove(name) : beansToDestroy.get(name); - if (holder != null) { - String destroyMethod = holder.getValue(); - Object target = holder.getKey(); - try { - org.apache.camel.support.ObjectHelper.invokeMethodSafe(destroyMethod, target); - } catch (Exception e) { - LOG.warn("Error invoking destroy method: {} on bean: {} due to: {}. This exception is ignored.", - destroyMethod, target, e.getMessage(), e); - } - } - } - - public void stop() throws Exception { - // beans should trigger destroy methods on shutdown - for (String name : beansToDestroy.keySet()) { - destroyBean(name, false); - } - beansToDestroy.clear(); - } - } diff --git a/dsl/camel-yaml-dsl/camel-yaml-dsl/src/main/java/org/apache/camel/dsl/yaml/YamlRoutesBuilderLoaderSupport.java b/dsl/camel-yaml-dsl/camel-yaml-dsl/src/main/java/org/apache/camel/dsl/yaml/YamlRoutesBuilderLoaderSupport.java index d7e77b54cb9..bfd11e5212f 100644 --- a/dsl/camel-yaml-dsl/camel-yaml-dsl/src/main/java/org/apache/camel/dsl/yaml/YamlRoutesBuilderLoaderSupport.java +++ b/dsl/camel-yaml-dsl/camel-yaml-dsl/src/main/java/org/apache/camel/dsl/yaml/YamlRoutesBuilderLoaderSupport.java @@ -113,8 +113,4 @@ public abstract class YamlRoutesBuilderLoaderSupport extends RouteBuilderLoaderS return null; } - @Override - protected void doStop() throws Exception { - beansDeserializer.stop(); - } }