कैसे कर सकते हैं मैं प्रोग्राम के रूप में बंद एक स्प्रिंग बूट आवेदन वीएम समाप्त बिना ?
अन्य कार्यों में, इसके विपरीत क्या है
new SpringApplication(Main.class).run(args);
कैसे कर सकते हैं मैं प्रोग्राम के रूप में बंद एक स्प्रिंग बूट आवेदन वीएम समाप्त बिना ?
अन्य कार्यों में, इसके विपरीत क्या है
new SpringApplication(Main.class).run(args);
जवाबों:
एक समापन SpringApplicationमूल रूप से अंतर्निहित बंद करने का मतलब है ApplicationContext। SpringApplication#run(String...)विधि आपको यह बताती है कि ApplicationContextए ConfigurableApplicationContext। फिर close()आप स्वयं कर सकते हैं ।
उदाहरण के लिए,
@SpringBootApplication
public class Example {
public static void main(String[] args) {
ConfigurableApplicationContext ctx = SpringApplication.run(Example.class, args);
// ...determine it's time to shut down...
ctx.close();
}
}
वैकल्पिक रूप से, आप इसे करने के लिए static SpringApplication.exit(ApplicationContext, ExitCodeGenerator...)सहायक विधि का उपयोग कर सकते हैं । उदाहरण के लिए,
@SpringBootApplication
public class Example {
public static void main(String[] args) {
ConfigurableApplicationContext ctx = SpringApplication.run(Example.class, args);
// ...determine it's time to stop...
int exitCode = SpringApplication.exit(ctx, new ExitCodeGenerator() {
@Override
public int getExitCode() {
// no errors
return 0;
}
});
// or shortened to
// int exitCode = SpringApplication.exit(ctx, () -> 0);
System.exit(exitCode);
}
}
ExitCodeGeneratorइसका उपयोग कैसे किया जा सकता है। आप केवल mainकृपापूर्वक बाहर निकलने की विधि से वापस आ सकते हैं (कोड 0 से बाहर निकलें)।
स्प्रिंग बूट एप्लिकेशन में आप कुछ इस तरह का उपयोग कर सकते हैं
ShutdownManager.java
import org.springframework.context.ApplicationContext;
import org.springframework.boot.SpringApplication;
@Component
class ShutdownManager{
@Autowired
private ApplicationContext appContext;
public void initiateShutdown(int returnCode){
SpringApplication.exit(appContext, () -> returnCode);
}
}
ApplicationContextस्वचालित रूप से अन्य फलियों में इंजेक्ट किया जा सकता है।
यह काम करता है, यहां तक कि मुद्रित भी किया जाता है।
SpringApplication.run(MyApplication.class, args).close();
System.out.println("done");
इसलिए .close()बाद में जोड़नाrun()
स्पष्टीकरण:
public ConfigurableApplicationContext run(String... args)एक नया ApplicationContext बनाने और ताज़ा करने के लिए, स्प्रिंग एप्लिकेशन चलाएँ। पैरामीटर:
args- आवेदन तर्क (आमतौर पर जावा मुख्य विधि से पारित)रिटर्न: एक चल रहा ApplicationContext
तथा:
void close()इस एप्लिकेशन के संदर्भ को बंद करें, जो सभी संसाधनों और तालों को जारी करता है जो कार्यान्वयन को रोक सकता है। इसमें सभी कैश्ड सिंगलटन बीन्स को नष्ट करना शामिल है। नोट: एक मूल संदर्भ के करीब आह्वान नहीं करता है; माता-पिता संदर्भों का अपना, स्वतंत्र जीवनचक्र है।इस विधि को साइड इफेक्ट्स के बिना कई बार कहा जा सकता है: पहले से ही बंद संदर्भ पर निकटवर्ती कॉल को अनदेखा किया जाएगा।
इसलिए मूल रूप से, यह मूल संदर्भ को बंद नहीं करेगा, यही कारण है कि VM नहीं छोड़ता है।
SpringApplication.exit(appContext, () -> returnCode)।
SpringApplication.run(MyApplication.class, args), तो इसका कोई मूल संदर्भ नहीं है। केवल एक संदर्भ है, संदर्भ बनाया और runउसके द्वारा लौटाया गया , जिसे आप फिर तुरंत close। @ मिचेल सही है। यह उन कार्यक्रमों के लिए काम नहीं करेगा जिन्हें स्प्रिंग संदर्भ के आरंभ होने के बाद कुछ भी करने की आवश्यकता है, जो कि अधिकांश कार्यक्रम हैं।
आवेदन में आप उपयोग कर सकते हैं SpringApplication। इसमें एक स्थिर exit()विधि है जो दो तर्क लेती है: a ApplicationContextऔर a ExitCodeGenerator:
अर्थात आप इस विधि की घोषणा कर सकते हैं:
@Autowired
public void shutDown(ExecutorServiceExitCodeGenerator exitCodeGenerator) {
SpringApplication.exit(applicationContext, exitCodeGenerator);
}
एकीकरण परीक्षणों के अंदर आप इसे @DirtiesContextकक्षा स्तर पर एनोटेशन जोड़कर प्राप्त कर सकते हैं :
@DirtiesContext(classMode=ClassMode.AFTER_CLASS) - संबंधित ApplicationContext को टेस्ट क्लास के बाद गंदे के रूप में चिह्नित किया जाएगा।@DirtiesContext(classMode=ClassMode.AFTER_EACH_TEST_METHOD) - संबंधित ApplicationContext को कक्षा में प्रत्येक परीक्षण विधि के बाद गंदे के रूप में चिह्नित किया जाएगा।अर्थात
@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest(classes = {Application.class},
webEnvironment= SpringBootTest.WebEnvironment.DEFINED_PORT, properties = {"server.port:0"})
@DirtiesContext(classMode= DirtiesContext.ClassMode.AFTER_CLASS)
public class ApplicationIT {
...
इससे यह सुनिश्चित हो जाएगा कि स्प्रिंगबूट एप्लिकेशन ठीक से बंद हो गया है और संसाधन ऑपरेटिंग सिस्टम में वापस आ गए हैं,
@Autowired
private ApplicationContext context;
@GetMapping("/shutdown-app")
public void shutdownApp() {
int exitCode = SpringApplication.exit(context, (ExitCodeGenerator) () -> 0);
System.exit(exitCode);
}