Skip to content

Commit c2f9a69

Browse files
predic8rrayst
andauthored
Fix load order of APIs #2413 (#2414)
* fix: fixes #2413 so that startup order of APIs stays the same - Added `start()` method to `BeanRegistry` interface and its implementation for lifecycle management. - Documented thread-safety expectations and constraints for `registerBeanDefinitions()` and `start()`. - Updated usage in relevant classes to adhere to the modified lifecycle flow. * refactor: simplify Javadoc to avoid redundant method references in BeanRegistry * refactor: replace `List` with `Set` for `uidsToActivate` to ensure ordering and updated `GrammarAutoGenerated` handling in `RouterCLI` * refactor: update `start()` method Javadoc to clarify usage, thread-safety, and execution flow * remove inconsistent comments --------- Co-authored-by: Tobias Polley <polley@predic8.de> Co-authored-by: Tobias Polley <mail@tobias-polley.de>
1 parent d635ddb commit c2f9a69

5 files changed

Lines changed: 16 additions & 10 deletions

File tree

annot/src/main/java/com/predic8/membrane/annot/yaml/BeanRegistry.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515

1616
import com.predic8.membrane.annot.*;
1717

18-
import java.util.List;
18+
import java.util.*;
1919

2020
public interface BeanRegistry {
2121

@@ -25,6 +25,8 @@ public interface BeanRegistry {
2525

2626
void registerBeanDefinitions(List<BeanDefinition> beanDefinitions);
2727

28+
void start();
29+
2830
Grammar getGrammar();
2931

3032
}

annot/src/main/java/com/predic8/membrane/annot/yaml/BeanRegistryImplementation.java

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -35,13 +35,13 @@ public class BeanRegistryImplementation implements BeanRegistry {
3535
/**
3636
* TODO Rename give meaningful name
3737
*/
38-
private final ConcurrentHashMap<String, Object> uuidMap = new ConcurrentHashMap<>();
38+
private final ConcurrentHashMap<String, Object> uuidMap = new ConcurrentHashMap<>(); // Order is here not critical
3939

4040
private final BlockingQueue<ChangeEvent> changeEvents = new LinkedBlockingDeque<>();
4141

4242
// uid -> bean definition
43-
private final Map<String, BeanDefinition> bds = new ConcurrentHashMap<>();
44-
private final Set<String> uidsToActivate = ConcurrentHashMap.newKeySet();
43+
private final Map<String, BeanDefinition> bds = new ConcurrentHashMap<>(); // Order is not critical. Order is determined by uidsToActivate
44+
private final Set<String> uidsToActivate = new LinkedHashSet<>(); // Provides order
4545

4646
public BeanRegistryImplementation(BeanCacheObserver observer, Grammar grammar) {
4747
this.observer = observer;
@@ -51,12 +51,8 @@ public BeanRegistryImplementation(BeanCacheObserver observer, Grammar grammar) {
5151
public void registerBeanDefinitions(List<BeanDefinition> bds) {
5252
bds.forEach(bd -> handle(ADDED, bd));
5353
fireConfigurationLoaded(); // Only put event in the queue
54-
start();
5554
}
5655

57-
/**
58-
* Blocks until all events have been processed. For Kubernets use that block in a separate thread e.g. in KubernetsWatcher.
59-
*/
6056
public void start() {
6157
while (!changeEvents.isEmpty()) {
6258
try {
@@ -92,7 +88,6 @@ public void handle(WatchAction action, JsonNode node) {
9288

9389
/**
9490
* May be called from multiple threads.
95-
*
9691
* TODO remove action?
9792
*/
9893
public void handle(WatchAction action, BeanDefinition bd) {

annot/src/test/java/com/predic8/membrane/annot/util/YamlParser.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@ public YamlParser(String resourceName) throws ClassNotFoundException, NoSuchMeth
5050
beanRegistry = new BeanRegistryImplementation(getLatchObserver(cdl),generator);
5151
beanRegistry.registerBeanDefinitions(GenericYamlParser.parseMembraneResources(
5252
requireNonNull(cl.getResourceAsStream(normalized)), generator));
53+
beanRegistry.start();
5354

5455
cdl.await();
5556
}

core/src/main/java/com/predic8/membrane/core/cli/RouterCLI.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -156,7 +156,10 @@ private static Router initRouterByYAML(String location) throws Exception {
156156
router.setAsynchronousInitialization(true);
157157
router.start();
158158

159-
new BeanRegistryImplementation(router, new GrammarAutoGenerated()).registerBeanDefinitions(parseMembraneResources(router.getResolverMap().resolve(location), new GrammarAutoGenerated()));
159+
GrammarAutoGenerated grammar = new GrammarAutoGenerated();
160+
BeanRegistry registry = new BeanRegistryImplementation(router, grammar);
161+
registry.registerBeanDefinitions(parseMembraneResources(router.getResolverMap().resolve(location), grammar));
162+
registry.start();
160163

161164
return router;
162165
}

core/src/test/java/com/predic8/membrane/core/kubernetes/GenericYamlParserTest.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -345,6 +345,11 @@ public void registerBeanDefinitions(List<BeanDefinition> beanDefinitions) {
345345

346346
}
347347

348+
@Override
349+
public void start() {
350+
351+
}
352+
348353
@Override
349354
public Grammar getGrammar() {
350355
return null;

0 commit comments

Comments
 (0)