প্রোগ্রামিংভাবে স্প্রিং বুট অ্যাপ্লিকেশনটি বন্ধ করে দিন


109

কীভাবে আমি প্রোগ্রামেটিক্যালি শাটডাউন একটি স্প্রিং বুট আবেদন VM- র সসীম ছাড়া ?

অন্যান্য কাজের ক্ষেত্রে এর বিপরীতটি কী

new SpringApplication(Main.class).run(args);

1
ভাল যুক্তি! কাছে কল করা () এ কাজটি করা উচিত।
এক্সেল


পুনঃটুইট করেছেন এটি একটি কোনও এপিআই সম্পর্কে, অন্যটি অপ্সকে এটি করার কোনও উপায় সম্পর্কে।
এক্সেল ফন্টেইন

ঠিক আছে .. এই প্রশ্ন লিঙ্কটি অন্যকে সাহায্য করতে পারে। আপনি কি আমাকে উপরের মন্তব্যটি মুছতে চান?
আনন্দ বার্কি ফিলিপস

উত্তর:


111

একটি ক্লোজিং SpringApplicationমূলত অন্তর্নিহিত বন্ধের মানে ApplicationContextSpringApplication#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);
    }
}

1
আমি যদি ctx.close () ব্যবহার করি; ডানদিকে শেষে System.exit (n) কল করার দরকার নেই? প্রসঙ্গে বন্ধ () এর ভিতরে System.exit () থাকা উচিত?
Denys

2
@ ডেনিস না, প্রসঙ্গটি জাভা প্রক্রিয়াটি বন্ধের সময় প্রস্থান করবে না। আমার উদাহরণের প্রস্থানটি কেবল কীভাবে ExitCodeGeneratorব্যবহার করা যেতে পারে তা দেখায় । আপনি কেবল mainপদ্ধতি থেকে মনোযোগ দিয়ে প্রস্থান করতে ফিরে আসতে পারেন (প্রস্থান কোড 0)
সোটিরিওস ডেলিমনোলিস

78

একটি বসন্ত বুট অ্যাপ্লিকেশন আপনি এই জাতীয় কিছু ব্যবহার করতে পারেন

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);
    }
}

16
ApplicationContextঅন্য শিমের মধ্যে স্বয়ংক্রিয়ভাবে ইনজেকশন দেওয়া যায় তা দেখানোর জন্য আপভোট করুন ।
অ্যান্থনি চুইনার্ড

1
@ স্নোভেলি কীভাবে শাটডাউন পদ্ধতি শুরু করবেন? সূচনা ডাউন (এক্স), এক্স = 0?
স্ট্যাকওভারফ্লো

যখন শর্তাধীন শাটডাউন হয়, তখন এটি কার্যকর করা যায়। স্প্রিং অ্যাপ্লিকেশন.আরুন (..)। প্রোগ্রামটি সম্পূর্ণ হওয়ার সাথে সাথে ক্লোজ () করবে।
আবুব্যাকার সিদ্দিক

কেন স্প্রিং অ্যাপ্লিকেশন। (অ্যাপকন্টেক্সট, () -> রিটার্ন কোড); কেন appContext.close () করতে পারবেন না। পার্থক্য কি ?
রামস

পছন্দ করুন উদাহরণস্বরূপ আপনি শাটডাউন ম্যানেজারটিকে একটি রেস্টকন্ট্রোলারে ইনজেক্ট করতে এবং রিমোট শাটডাউনের অনুমতি দিতে পারেন, বা আপনি এটি কোনও স্বাস্থ্য পরীক্ষা মনিটরিংয়ে ইনজেকশন করতে পারেন যা ডাউন স্ট্রিম পরিষেবাগুলি নিখোঁজ হওয়ার কারণে জেভিএমকে বন্ধ করে দেবে
স্নোভেলি

36

এটি কাজ করে, এমনকি মুদ্রিত হয়।

  SpringApplication.run(MyApplication.class, args).close();
  System.out.println("done");

সুতরাং .close()পরে যোগrun()

ব্যাখ্যা:

public ConfigurableApplicationContext run(String... args)

একটি নতুন অ্যাপ্লিকেশন কনটেক্সট তৈরি করে এবং সতেজ করে Spring পরামিতি:

args - আবেদনের যুক্তি (সাধারণত একটি জাভা প্রধান পদ্ধতি থেকে পাস করা)

রিটার্নস: একটি চলমান অ্যাপ্লিকেশন কনটেক্সট

এবং:

void close()বাস্তবায়নটি ধরে রাখতে পারে এমন সমস্ত সংস্থান এবং লকগুলি প্রকাশ করে এই অ্যাপ্লিকেশন প্রসঙ্গটি বন্ধ করুন। এর মধ্যে সমস্ত ক্যাশেড সিঙ্গলটন মটরশুটি ধ্বংস করা অন্তর্ভুক্ত। দ্রষ্টব্য: পিতামাতার প্রসঙ্গে নিকটে প্রার্থনা করে না; পিতামাতার প্রসঙ্গে তাদের নিজস্ব, স্বাধীন জীবনচক্র রয়েছে।

পার্শ্ব প্রতিক্রিয়া ছাড়াই এই পদ্ধতিটিকে একাধিকবার বলা যেতে পারে: ইতিমধ্যে বন্ধ হওয়া প্রসঙ্গে পরবর্তী নিকটবর্তী কলগুলি উপেক্ষা করা হবে।

সুতরাং মূলত, এটি প্যারেন্ট প্রসঙ্গটি বন্ধ করবে না, এজন্য ভিএম ছাড়বে না।


2
এই সমাধানটি ব্যাচের মতো স্বল্পস্থায়ী প্রক্রিয়ার জন্য কাজ করে, তবে এটি স্প্রিং এমভিসি অ্যাপ্লিকেশনগুলিতে ব্যবহার করবেন না। বুট করার পরে অ্যাপ্লিকেশনটি বন্ধ হয়ে গেছে।
মাইকেল COLL

@ মিশেলকোল প্রশ্নটি হ'ল কীভাবে প্রকার নির্বিশেষে একটি স্প্রিং বুট অ্যাপটিকে কর্মসূচী থেকে বন্ধ করতে হবে। এটি স্প্রিং এমভিসি
এসিভি

1
@ ACV আপনি ঠিক বলেছেন এটি কাজ করে, এটি খুব ভালভাবে কাজ করে। তবে এমন একটি অ্যাপের জন্য যা অবশ্যই অবিরত থাকবে (স্প্রিং এমভিসি অ্যাপ্লিকেশানের মতো), আমি মনে করি, এটি এটি করার ভাল উপায় নয়। আমার ক্ষেত্রে, আমি ব্যবহার করেছি SpringApplication.exit(appContext, () -> returnCode)
মাইকেল COLL

1
আপনি আপনার শেষ লাইনে কোন ভিএম উল্লেখ করছেন? আপনি যদি আপনার স্প্রিং বুট অ্যাপ্লিকেশনটি দিয়ে শুরু SpringApplication.run(MyApplication.class, args)করেন তবে কোনও প্যারেন্ট প্রসঙ্গ নেই। এখানে কেবল একটি প্রসঙ্গ আছে, প্রসঙ্গটি তৈরি এবং ফিরে এসেছিল run, যা আপনি তত্ক্ষণাত close। @ মিশেল ঠিক আছে। এটি স্প্রিং প্রসঙ্গটি আরম্ভ করার পরে যে প্রোগ্রামগুলি কিছু করার প্রয়োজন তাগুলির জন্য কাজ করবে না, যা বেশিরভাগ প্রোগ্রাম।
উদ্ধারকর্তা

@ সাভিয়ার জেভিএম একটি পিতামাতার প্রসঙ্গ আছে। এখানে আমরা স্প্রিং বুট অ্যাপ্লিকেশনটি কীভাবে বন্ধ করব সে সম্পর্কে কথা বলছি। আপনি সাধারণত ওয়েব অ্যাপ্লিকেশনগুলি এইভাবে বন্ধ করেন না। সুতরাং এই প্রক্রিয়াটি স্বল্পকালীন অ্যাপ্লিকেশনগুলির জন্য সাধারণত ব্যবহৃত হয় যা কিছু করে তারপরে বন্ধ করা দরকার। ডিফল্টরূপে, আপনার ব্যাচ প্রসেসিং শেষ করার পরেও স্প্রিং বুট চলতে থাকবে যাতে আপনি এই ব্যবস্থাটি ব্যবহার করতে চান।
এসিভি

3

অ্যাপ্লিকেশন আপনি ব্যবহার করতে পারেন 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 {
...

ঠিক আছে. আমার কাছে এক্সিকিউটর সার্ভিস এক্সিটকোড জেনারেটর পাওয়ার কথা কোথায়? যদি এটি শিম হয় তবে আপনি কি তৈরির স্নিপেট কোডটি (এবং এটি কোন শ্রেণী থেকে তৈরি করা হয়েছে) প্রদর্শন করতে পারেন? কোন শ্রেণিতে পদ্ধতিটি শাটডাউন (এক্সিকিউটারসেসওয়ার্সিটকিডিজেনেটর এক্সটেনসকোডিজেনেটর) স্থাপন করা উচিত?
ভ্লাদ জি।

2

এটি নিশ্চিত করবে যে স্প্রিংবুট অ্যাপ্লিকেশনটি সঠিকভাবে বন্ধ হয়েছে এবং সংস্থানগুলি অপারেটিং সিস্টেমে প্রকাশিত হবে,

@Autowired
private ApplicationContext context;

@GetMapping("/shutdown-app")
public void shutdownApp() {

    int exitCode = SpringApplication.exit(context, (ExitCodeGenerator) () -> 0);
    System.exit(exitCode);
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.