2016-04-27 10 views
11

मेरे पास मेरे स्प्रिंग बूट ऐप के लिए एक एकल application.yml कॉन्फ़िगरेशन फ़ाइल है जो दो प्रोफाइल को परिभाषित करती है (जैसा कि documentation में वर्णित है)।क्या मैं स्प्रिंग बूट कॉन्फ़िगरेशन फ़ाइलों के भीतर सिस्टम प्रॉपर्टी को परिभाषित कर सकता हूं?

जब उत्पादन प्रोफ़ाइल सक्षम है, तो मैं http.maxConnections सिस्टम प्रॉपर्टी को कस्टम मान पर सेट करना चाहता हूं, उदा।

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

लेकिन यह वास्तव में सिस्टम स्तर की संपत्ति सेट नहीं करता है; ऐसा लगता है कि सिर्फ एक आवेदन-स्तर की संपत्ति बनाएं। मैं दोनों http://locahost:8080/env के माध्यम से इस की पुष्टि कर लें और एक JMX कंसोल जब

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

द्वारा शुरू की तुलना बनाम

java -Dhttp.maxConnections=15 myapp.jar 

मुझे लगता है मैं एक सेम है कि "उत्पादन" प्रोफ़ाइल है कि प्रोग्राम के रूप में System.setProperty कॉल पर @Conditional है बना सकते हैं मेरे application.yml-निर्धारित संपत्ति के आधार पर, लेकिन अकेले कॉन्फ़िगरेशन फ़ाइलों के माध्यम से एक आसान तरीका है?

उत्तर

2

मुझे लगता है मैं एक सेम है कि "उत्पादन" प्रोफ़ाइल है कि प्रोग्राम के रूप में मेरी application.yml से परिभाषित संपत्ति के आधार पर callsSystem.setProperty पर @Conditional है बना सकते हैं लगता है, लेकिन वहाँ अकेले विन्यास फाइल के माध्यम से एक सरल तरीका है ?

मुझे लगता है कि यह आपकी सबसे अच्छी शर्त है। स्प्रिंग बूट खुद को LoggingSystem में करता है जहां विभिन्न logging.* गुण सिस्टम गुणों के लिए मैप किए जाते हैं।

ध्यान दें कि संभवत: Environment तैयार होने पर शायद आप सिस्टम गुणों को जितनी जल्दी हो सके सेट करना चाहते हैं। ऐसा करने के लिए, आप ApplicationListener का उपयोग कर सकते हैं जो ApplicationEnvironmentPreparedEvent के लिए सुनता है। आपके ApplicationListener कार्यान्वयन को spring.factories में प्रविष्टि के माध्यम से पंजीकृत किया जाना चाहिए।

3

आप कोशिश कर सकते हैं।

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

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

} 
+0

समस्या है, तो आप अन्यथा आप इसे संशोधित करने और अपने अनुप्रयोग – Palcente

+0

@Palcente हाँ, कुछ मतलब रिबूट सकता है आप इस बदलना चाहते हैं पुनर्वितरित करने की जरूरत है,। मेरा मानना ​​है कि आप 'application-production.yml' में गुण डाल सकते हैं जिसका उपयोग' उत्पादन' प्रोफ़ाइल में किया जाएगा। – TheKojuEffect

0

आप उस वर्ग के निर्माता में पर्यावरण को इंजेक्ट कर सकते हैं जो सेम निर्दिष्ट करता है। इससे आपको बीन्स बनने से पहले सिस्टम गुणों में एप्लिकेशन गुण लिखने की अनुमति मिलती है।

@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(); 
    } 
} 
संबंधित मुद्दे