Ich verwende Spring Boot mit Spring Integration und ich würde gerne verschiedene Eigenschaften für jede child()
Kontext laden. Ist das möglich?Spring Boot dynamischen Kontext erstellen (Eltern/Kind)
In diesem Moment arbeite ich mit diesem: (nur die relevantesten Linien)
SpringApplicationBuilder parent = new SpringApplicationBuilder(Main.class);
// Child sources (Will be inside a loop)
// Load the different environment ??
parent.child(ConfigDynamic.class);
// End of child loading
parent.run(args);
ich die SpringApplicationBuilder child()
Methode bewertet haben und die Eigenschaften sind vom Vater zum Kind propagiert:
child.properties(this.defaultProperties).environment(this.environment)
.additionalProfiles(this.additionalProfiles);
Aber ich brauche einige Eigenschaften dynamisch wie im folgenden Beispiel laden:
AnnotationConfigApplicationContext parent = new AnnotationConfigApplicationContext(Main.class);
parent.setId("parent");
Properties props = new Properties();
StandardEnvironment env = new StandardEnvironment();
AnnotationConfigApplicationContext child = new AnnotationConfigApplicationContext();
child.setId("child" + ++n);
child.setParent(parent);
child.register(ConfigDynamic.class);
// populate properties for this adapter
props.setProperty("prop1", myProp1);
props.setProperty("prop2", myProp2);
env.getPropertySources().addLast(pps);
child.setEnvironment(env);
child.refresh();
Aus diesem Beispiel extrahiert: Spring multiple imapAdapter
Der Grund dafür ist, dass einige Spring Integration-Komponenten dynamisch aus einer Konfigurationsdatei geladen werden. Daher muss ich verschiedene Kontexte mit den dynamischen Komponenten erstellen.
Jede mögliche Idee geschätzt werden, danke
Edit 1:
ich das Beispiel aktualisiert:
SpringApplicationBuilder parent = new SpringApplicationBuilder(Main.class);
for start
SpringApplicationBuilder child = parent.child(DynamicConfig.class);
//Properties creation..
child.context().getEnvironment().getPropertySources().addLast(pps);
child.run(args);
end for
parent.run(args);
Aber jetzt, der child()
Kontext ist null vor run()
Verfahren und Raises eine NPE.
Edit 2: (Arbeits)
SpringApplicationBuilder parent = new SpringApplicationBuilder(Main.class);
for start
SpringApplicationBuilder child = parent.child(DynamicConfig.class);
PropertiesPropertySource pps = new PropertiesPropertySource("dynamicProps", props);
StandardEnvironment env = new StandardEnvironment();
env.getPropertySources().addLast(pps);
child.environment(env);
child.run();
end for
parent.run(args);
Das letzte, was ich nicht verstehe, ist definitiv, warum ich einen Stammkontext müssen, selbst wenn alle meine @Component
und @Configuration
sind Komponenten Frühling Integration und geladen werden konnte als child()
. Ist der Elternkontext der Ort, an dem der Bus/die Komponente verschiedene Kinder kommunizieren kann? Ich denke, das könnte ein Speicherproblem sein, das mehrere Singletons für jeden Kontext lädt.
Kind() wirft Null-Zeiger-Ausnahme. Ich habe die Frage aktualisiert. – crm86