কীভাবে আমি প্রোগ্রামেটিক্যালি শাটডাউন একটি স্প্রিং বুট আবেদন VM- র সসীম ছাড়া ?
অন্যান্য কাজের ক্ষেত্রে এর বিপরীতটি কী
new SpringApplication(Main.class).run(args);
কীভাবে আমি প্রোগ্রামেটিক্যালি শাটডাউন একটি স্প্রিং বুট আবেদন VM- র সসীম ছাড়া ?
অন্যান্য কাজের ক্ষেত্রে এর বিপরীতটি কী
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)একটি নতুন অ্যাপ্লিকেশন কনটেক্সট তৈরি করে এবং সতেজ করে Spring পরামিতি:
args- আবেদনের যুক্তি (সাধারণত একটি জাভা প্রধান পদ্ধতি থেকে পাস করা)রিটার্নস: একটি চলমান অ্যাপ্লিকেশন কনটেক্সট
এবং:
void close()বাস্তবায়নটি ধরে রাখতে পারে এমন সমস্ত সংস্থান এবং লকগুলি প্রকাশ করে এই অ্যাপ্লিকেশন প্রসঙ্গটি বন্ধ করুন। এর মধ্যে সমস্ত ক্যাশেড সিঙ্গলটন মটরশুটি ধ্বংস করা অন্তর্ভুক্ত। দ্রষ্টব্য: পিতামাতার প্রসঙ্গে নিকটে প্রার্থনা করে না; পিতামাতার প্রসঙ্গে তাদের নিজস্ব, স্বাধীন জীবনচক্র রয়েছে।পার্শ্ব প্রতিক্রিয়া ছাড়াই এই পদ্ধতিটিকে একাধিকবার বলা যেতে পারে: ইতিমধ্যে বন্ধ হওয়া প্রসঙ্গে পরবর্তী নিকটবর্তী কলগুলি উপেক্ষা করা হবে।
সুতরাং মূলত, এটি প্যারেন্ট প্রসঙ্গটি বন্ধ করবে না, এজন্য ভিএম ছাড়বে না।
SpringApplication.exit(appContext, () -> returnCode)।
SpringApplication.run(MyApplication.class, args)করেন তবে কোনও প্যারেন্ট প্রসঙ্গ নেই। এখানে কেবল একটি প্রসঙ্গ আছে, প্রসঙ্গটি তৈরি এবং ফিরে এসেছিল run, যা আপনি তত্ক্ষণাত close। @ মিশেল ঠিক আছে। এটি স্প্রিং প্রসঙ্গটি আরম্ভ করার পরে যে প্রোগ্রামগুলি কিছু করার প্রয়োজন তাগুলির জন্য কাজ করবে না, যা বেশিরভাগ প্রোগ্রাম।
অ্যাপ্লিকেশন আপনি ব্যবহার করতে পারেন SpringApplication। এটিতে একটি স্থিতিশীল exit()পদ্ধতি রয়েছে যা দুটি আর্গুমেন্ট গ্রহণ করে: একটি ApplicationContextএবং ExitCodeGenerator:
অর্থাৎ আপনি এই পদ্ধতিটি ঘোষণা করতে পারেন:
@Autowired
public void shutDown(ExecutorServiceExitCodeGenerator exitCodeGenerator) {
SpringApplication.exit(applicationContext, exitCodeGenerator);
}
ইন্টিগ্রেশন পরীক্ষার ভিতরে আপনি @DirtiesContextশ্রেণি স্তরে টিকা যোগ করে এটি অর্জন করতে পারেন :
@DirtiesContext(classMode=ClassMode.AFTER_CLASS) - সম্পর্কিত অ্যাপ্লিকেশন কনটেক্সট পরীক্ষা ক্লাসের পরে নোংরা হিসাবে চিহ্নিত করা হবে।@DirtiesContext(classMode=ClassMode.AFTER_EACH_TEST_METHOD) - সম্পর্কিত অ্যাপ্লিকেশন কনটেক্সট ক্লাসে প্রতিটি পরীক্ষা পদ্ধতি পরে নোংরা হিসাবে চিহ্নিত করা হবে।অর্থাত
@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);
}