2016-04-27 13 views
11

Ich habe eine einzige application.yml Konfigurationsdatei für meine Spring Boot App, die zwei Profile definiert (wie in der documentation beschrieben).Kann ich Systemeigenschaften in Spring Boot-Konfigurationsdateien definieren?

Wenn das Produktionsprofil aktiviert ist, möchte ich die Systemeigenschaft http.maxConnections auf einen benutzerdefinierten Wert festlegen, z.

spring: 
    profiles: 
     active: dev 
--- 
spring: 
    profiles: dev 
--- 
spring: 
    profiles: production 
http: 
    maxConnections: 15 

Aber dies stellt nicht tatsächlich die System-Level-Eigenschaft; Es scheint nur eine Eigenschaft auf Anwendungsebene zu erstellen. Ich habe sowohl das durch http://locahost:8080/env verifiziert und eine JMX-Konsole, wenn sie von

java -jar -Dspring.profiles.active=production myapp.jar 

gegen

java -Dhttp.maxConnections=15 myapp.jar 

Abschuss Vergleich Ich glaube, ich könnte eine Bohne erstellen, die @Conditional auf die „Herstellung“ Profil ist die programmatisch ruft System.setProperty basierend auf meiner application.yml -defined-Eigenschaft, aber gibt es einen einfacheren Weg durch Konfigurationsdateien allein?

Antwort

2

Ich glaube, ich könnte eine Bohne erstellen, die auf die „Herstellung“ Profil @Conditional ist die programmatisch callsSystem.setProperty basiert auf meiner application.yml definierte Eigenschaft, aber gibt es einen einfacheren Weg durch Konfigurationsdateien allein ?

Ich denke, das ist Ihre beste Wette hier. Spring Boot macht das selbst in seinem LoggingSystem wo verschiedene logging.* Eigenschaften Systemeigenschaften zugeordnet sind.

Beachten Sie, dass Sie wahrscheinlich die Systemeigenschaften so früh wie möglich festlegen möchten, wahrscheinlich, sobald die Environment vorbereitet ist. Um dies zu tun, können Sie eine ApplicationListener verwenden, die auf die ApplicationEnvironmentPreparedEvent hört. Ihre ApplicationListener Implementierung sollte über einen Eintrag in spring.factories registriert werden.

3

Sie können es versuchen.

@Profile("production") 
@Component 
public class ProductionPropertySetter { 

    @PostConstruct 
    public void setProperty() { 
     System.setProperty("http.maxConnections", 15); 
    } 

} 
+0

das Problem ist, müssen Sie erneut bereitstellen, wenn Sie dies ändern wollen, sonst hat man es nur ändern könnte, und starten Sie Ihre App – Palcente

+0

@Palcente ja, die Sinn machen. Ich glaube, dass Sie Eigenschaften in 'application-production.yml' setzen können, die im' production' Profil verwendet werden. – TheKojuEffect

0

Sie können die Umgebung in den Konstruktor der Klasse injizieren, die die Beans angibt. Auf diese Weise können Sie Anwendungseigenschaften in die Systemeigenschaften schreiben, bevor die Beans erstellt werden.

@Configuration 
public class ApplicationBeans { 

    @Autowired 
    public ApplicationBeans(Environment environment) { 
     // set system properties before the beans are being created. 
     String property = "com.application.property"; 
     System.getProperties().setProperty(property, environment.getProperty(property)); 
    } 

    /** 
    * Bean that depends on the system properties 
    */ 
    @Bean 
    public SomeBean someBean() { 
     return new SomeBean(); 
    } 
}