কীভাবে আমি প্রোগ্রামেটিক্যালি শাটডাউন একটি স্প্রিং বুট আবেদন 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);
}