2016-08-23 7 views
1

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.

Antwort

0

Dies sollte funktionieren ...

SpringApplicationBuilder child = builder.child(ConfigDynamic.class); 
... 
child.context().getEnvironment().getPropertySources().addLast(pps); 
... 
child.run(); 
+0

Kind() wirft Null-Zeiger-Ausnahme. Ich habe die Frage aktualisiert. – crm86

Verwandte Themen