diff --git a/annot/src/main/java/com/predic8/membrane/annot/yaml/BeanRegistry.java b/annot/src/main/java/com/predic8/membrane/annot/yaml/BeanRegistry.java index 01f56ed6b6..0fbae75dcb 100644 --- a/annot/src/main/java/com/predic8/membrane/annot/yaml/BeanRegistry.java +++ b/annot/src/main/java/com/predic8/membrane/annot/yaml/BeanRegistry.java @@ -15,7 +15,7 @@ import com.predic8.membrane.annot.*; -import java.util.List; +import java.util.*; public interface BeanRegistry { @@ -25,6 +25,8 @@ public interface BeanRegistry { void registerBeanDefinitions(List beanDefinitions); + void start(); + Grammar getGrammar(); } diff --git a/annot/src/main/java/com/predic8/membrane/annot/yaml/BeanRegistryImplementation.java b/annot/src/main/java/com/predic8/membrane/annot/yaml/BeanRegistryImplementation.java index 35203f2ded..7ed672c7e0 100644 --- a/annot/src/main/java/com/predic8/membrane/annot/yaml/BeanRegistryImplementation.java +++ b/annot/src/main/java/com/predic8/membrane/annot/yaml/BeanRegistryImplementation.java @@ -35,13 +35,13 @@ public class BeanRegistryImplementation implements BeanRegistry { /** * TODO Rename give meaningful name */ - private final ConcurrentHashMap uuidMap = new ConcurrentHashMap<>(); + private final ConcurrentHashMap uuidMap = new ConcurrentHashMap<>(); // Order is here not critical private final BlockingQueue changeEvents = new LinkedBlockingDeque<>(); // uid -> bean definition - private final Map bds = new ConcurrentHashMap<>(); - private final Set uidsToActivate = ConcurrentHashMap.newKeySet(); + private final Map bds = new ConcurrentHashMap<>(); // Order is not critical. Order is determined by uidsToActivate + private final Set uidsToActivate = new LinkedHashSet<>(); // Provides order public BeanRegistryImplementation(BeanCacheObserver observer, Grammar grammar) { this.observer = observer; @@ -51,12 +51,8 @@ public BeanRegistryImplementation(BeanCacheObserver observer, Grammar grammar) { public void registerBeanDefinitions(List bds) { bds.forEach(bd -> handle(ADDED, bd)); fireConfigurationLoaded(); // Only put event in the queue - start(); } - /** - * Blocks until all events have been processed. For Kubernets use that block in a separate thread e.g. in KubernetsWatcher. - */ public void start() { while (!changeEvents.isEmpty()) { try { @@ -92,7 +88,6 @@ public void handle(WatchAction action, JsonNode node) { /** * May be called from multiple threads. - * * TODO remove action? */ public void handle(WatchAction action, BeanDefinition bd) { diff --git a/annot/src/test/java/com/predic8/membrane/annot/util/YamlParser.java b/annot/src/test/java/com/predic8/membrane/annot/util/YamlParser.java index 1f85717859..aa6a5e6629 100644 --- a/annot/src/test/java/com/predic8/membrane/annot/util/YamlParser.java +++ b/annot/src/test/java/com/predic8/membrane/annot/util/YamlParser.java @@ -50,6 +50,7 @@ public YamlParser(String resourceName) throws ClassNotFoundException, NoSuchMeth beanRegistry = new BeanRegistryImplementation(getLatchObserver(cdl),generator); beanRegistry.registerBeanDefinitions(GenericYamlParser.parseMembraneResources( requireNonNull(cl.getResourceAsStream(normalized)), generator)); + beanRegistry.start(); cdl.await(); } diff --git a/core/src/main/java/com/predic8/membrane/core/cli/RouterCLI.java b/core/src/main/java/com/predic8/membrane/core/cli/RouterCLI.java index a85388aa79..6e772c96ff 100644 --- a/core/src/main/java/com/predic8/membrane/core/cli/RouterCLI.java +++ b/core/src/main/java/com/predic8/membrane/core/cli/RouterCLI.java @@ -156,7 +156,10 @@ private static Router initRouterByYAML(String location) throws Exception { router.setAsynchronousInitialization(true); router.start(); - new BeanRegistryImplementation(router, new GrammarAutoGenerated()).registerBeanDefinitions(parseMembraneResources(router.getResolverMap().resolve(location), new GrammarAutoGenerated())); + GrammarAutoGenerated grammar = new GrammarAutoGenerated(); + BeanRegistry registry = new BeanRegistryImplementation(router, grammar); + registry.registerBeanDefinitions(parseMembraneResources(router.getResolverMap().resolve(location), grammar)); + registry.start(); return router; } diff --git a/core/src/test/java/com/predic8/membrane/core/kubernetes/GenericYamlParserTest.java b/core/src/test/java/com/predic8/membrane/core/kubernetes/GenericYamlParserTest.java index e7772ef7db..a4fe5b72a6 100644 --- a/core/src/test/java/com/predic8/membrane/core/kubernetes/GenericYamlParserTest.java +++ b/core/src/test/java/com/predic8/membrane/core/kubernetes/GenericYamlParserTest.java @@ -345,6 +345,11 @@ public void registerBeanDefinitions(List beanDefinitions) { } + @Override + public void start() { + + } + @Override public Grammar getGrammar() { return null;