একটি সঠিক উপায়ে একটি স্প্রিং বুট অ্যাপ্লিকেশন কীভাবে বন্ধ করবেন?


120

স্প্রিং বুট ডকুমেন্টে, তারা বলেছিল যে 'প্রতিটি স্প্রিং অ্যাপ্লিকেশনটি JVM- এর সাথে শাটডাউন হুকটি নিবন্ধভুক্ত করবে যাতে এপ্লিকেশনকন্টেক্সটি প্রস্থান করার সময় নিখুঁতভাবে বন্ধ হয়।'

আমি যখন ctrl+cশেল কমান্ডে ক্লিক করি তখন অ্যাপ্লিকেশনটি নিখুঁতভাবে বন্ধ করা যেতে পারে। আমি যদি কোনও প্রোডাকশন মেশিনে অ্যাপ্লিকেশনটি চালিত করি তবে আমাকে কমান্ডটি ব্যবহার করতে হবে java -jar ProApplicaton.jar। তবে আমি শেল টার্মিনালটি বন্ধ করতে পারি না, অন্যথায় এটি প্রক্রিয়াটি বন্ধ করে দেবে।

যদি আমি কমান্ডটি চালিত করি তবে আমি এটিকে গ্রেপ্তার করে বন্ধ nohup java -jar ProApplicaton.jar &করতে পারি না ctrl+c

উত্পাদন পরিবেশে একটি স্প্রিং বুট অ্যাপ্লিকেশন শুরু এবং বন্ধ করার সঠিক উপায় কী?


আপনার কনফিগারেশন উপর নির্ভর করে অ্যাপ্লিকেশন এর পিআইডি ফাইল লিখিত হয়। আপনি সেই পিআইডিতে একটি কিল সংকেত পাঠাতে পারেন। এই ইস্যুতে মন্তব্যগুলি দেখুন ।
এম। ডেইনুম

আমার কোন সিগন্যালটি ব্যবহার করা উচিত, আমি মনে করি না কিল -9 একটি ভাল ধারণা, তাইনা?
ক্রিস

5
সে কারণেই আমি আপনাকে সেই সুতার দিকে ইঙ্গিত করলাম ... তবে এর মতো কিছুতে kill -SIGTERM <PID>কৌতুক করা উচিত।
এম। ডিনুম

পিড দিয়ে হত্যা করুন, নং -9
ডাপেং

1
কিল $ (lsof -ti tcp: <port>) - আপনি যদি অ্যাক্টিভেটর ব্যবহার করতে না চান এবং দ্রুত
অ্যালেক্স নোলাস্কো

উত্তর:


61

আপনি যদি অ্যাকিউটিটর মডিউলটি ব্যবহার করেন তবে আপনি অ্যাপ্লিকেশনটি শাটডাউন করতে পারবেন JMXবা HTTPশেষ পয়েন্টটি সক্ষম থাকলে if

যোগ করুন application.properties:

endpoints.shutdown.enabled = সত্য

নিম্নলিখিত URL টি উপলব্ধ হবে:

/actuator/shutdown - অ্যাপ্লিকেশনটিকে কৌতূহলীভাবে শাটডাউন করার অনুমতি দেয় (ডিফল্টরূপে সক্ষম নয়)।

কোনও শেষ পয়েন্টটি কীভাবে প্রকাশিত হবে তার উপর নির্ভর করে সংবেদনশীল প্যারামিটারটি সুরক্ষা ইঙ্গিত হিসাবে ব্যবহার করা যেতে পারে।

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

থেকে বসন্ত বুট ডকুমেন্টেশন


1
আমি অ্যাকিউউটর মডিউলটি অন্তর্ভুক্ত করতে চাই না। তবে আমি দেখতে পেলাম যে আমার কনসোল লগে স্প্রিং বুট প্রথম লাইনে পিআইডি প্রিন্ট করে। অ্যাকিউউটর মডিউল (অ্যাপ্লিকেশনপিডলিস্টনার) যুক্ত না করে স্প্রিং বুটকে অন্য ফাইলটিতে পিআইডি প্রিন্ট করার কোনও উপায় আছে কি?
ক্রিস

2
দ্রষ্টব্য এটি এই শেষ বিন্দুতে একটি পোস্ট পোস্ট হতে হবে। আপনি এটিকে
endpPoint.shutdown.enabled

54

এখানে আরেকটি বিকল্প রয়েছে যা আপনাকে কোড পরিবর্তন করতে বা শাট ডাউন ডাউনপয়েন্টটি প্রকাশের প্রয়োজন হবে না। নিম্নলিখিত অ্যাপ্লিকেশন তৈরি করুন এবং আপনার অ্যাপ্লিকেশন শুরু এবং বন্ধ করতে এগুলি ব্যবহার করুন।

start.sh

#!/bin/bash
java -jar myapp.jar & echo $! > ./pid.file &

আপনার অ্যাপ্লিকেশন শুরু করে এবং কোনও ফাইলের মধ্যে প্রক্রিয়া আইডি সংরক্ষণ করে

stop.sh

#!/bin/bash
kill $(cat ./pid.file)

সংরক্ষিত প্রক্রিয়া আইডি ব্যবহার করে আপনার অ্যাপটিকে থামায়

start_silent.sh

#!/bin/bash
nohup ./start.sh > foo.out 2> foo.err < /dev/null &

আপনার যদি কোনও দূরবর্তী মেশিন বা সিআই পাইপলাইন থেকে এসএসএস ব্যবহার করে অ্যাপ্লিকেশনটি শুরু করতে হয় তবে আপনার অ্যাপ্লিকেশন শুরু করার পরিবর্তে এই স্ক্রিপ্টটি ব্যবহার করুন। স্টার্ট.শ ব্যবহার করে শেলটি ঝুলতে পারে।

যেমন উদা। আপনার অ্যাপ পুনরায় স্থাপন করা হচ্ছে আপনি এটি ব্যবহার করে এটি পুনরায় চালু করতে পারেন:

sshpass -p password ssh -oStrictHostKeyChecking=no userName@www.domain.com 'cd /home/user/pathToApp; ./stop.sh; ./start_silent.sh'

এই উত্তর হওয়া উচিত। আমি কেবল নিশ্চিত করেছি যে একটি সংকেত 15 শাটডাউন বসন্তকে সুন্দরভাবে বন্ধ করতে বলে tells
চাদ

1
আপনি জাভা - জার এক্সিকিউশনটিকে নোহুপ দিয়ে স্টার্ট.শ এর অভ্যন্তরে কল করবেন না, জাভা কল করার চেয়ে - জার এক্সিকিউশন ভিতরে স্টার্ট.শ যা অন্য বাইরের শেল স্ক্রিপ্টের ভিতরে নোহুপ দিয়ে ডাকা হয় ??
আনন্দ বার্কি ফিলিপস

2
@ আনন্দ ভার্কি ফিলিপস একমাত্র কারণ হ'ল আমি মাঝে মাঝে পরীক্ষার উদ্দেশ্যে কমান্ড লাইন থেকে start.sh কল করি তবে আপনার যদি সর্বদা প্রয়োজন হয় nohupতবে আপনি কেবল কমান্ডগুলি মার্জ করতে পারেন
জেনস

@ জেনস, তথ্যের জন্য ধন্যবাদ। আপনি কি আমাকে বলতে পারেন: foo.out 2> foo.err </ dev / null &
আনন্দ ভার্কি ফিলিপস

1
@ জেনস, ধন্যবাদ আমি এটি সফলতার সাথে করেছি এবং আমি এখানে আমার স্টার্ট এবং স্টপ স্ক্রিপ্ট নীচে পোস্ট করেছি। ( স্ট্যাকওভারফ্লো.com / জিজ্ঞাসা / ২6565৫75৫২৩২/২ )
আনন্দ ভার্কি ফিলিপস

52

@ জিন-ফিলিপ বন্ডের উত্তর হিসাবে,

স্পেন-বুট-স্টার্টার-অ্যাকিউুয়েটার ব্যবহার করে একটি স্প্রিং বুট ওয়েব অ্যাপ্লিকেশনটি বন্ধ করতে HTTP এন্ডপয়েন্টটি কনফিগার করার জন্য মভেন ব্যবহারকারীদের জন্য এখানে মভেন কুইক উদাহরণ রয়েছে: যাতে আপনি অনুলিপি এবং পেস্ট করতে পারেন:

1.ম্যাভেন পম.এক্সএমএল:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

2.application.properties:

#No auth  protected 
endpoints.shutdown.sensitive=false

#Enable shutdown endpoint
endpoints.shutdown.enabled=true

সমস্ত শেষ পয়েন্ট এখানে তালিকাভুক্ত করা হয় :

অ্যাপ্লিকেশনটি বন্ধ করার জন্য একটি পোস্ট পদ্ধতি পাঠান:

curl -X POST localhost:port/shutdown

সুরক্ষা নোট:

আপনার যদি শাটডাউন পদ্ধতির লেখক সুরক্ষিত দরকার হয় তবে আপনার প্রয়োজনও হতে পারে

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-security</artifactId>
</dependency>

বিশদটি কনফিগার করুন :


দ্বিতীয় পদক্ষেপের পরে, মোতায়েনের চেষ্টা করার সময়, এই ত্রুটি বার্তাটি পূরণ করে: বিবরণ: org.springframework.security.config.annotation.web.configration.WebSecurityConfigurerAdapter মধ্যে পদ্ধতি সেটআউটেনটিকেশন কনফিগারেশন এর প্যারামিটার 0 অরগ। .annotation.authentication.configration.AuthenticationConfigration 'যা পাওয়া যায় নি। ক্রিয়া: আপনার কনফিগারেশনে 'org.springframework.security.config.annotation.authentication.configration.AuthenticationConfigration' টাইপের একটি সিমের সংজ্ঞাটি বিবেচনা করুন।
রবার্তো

2
দয়া করে মনে রাখবেন: আমি ভালো কিছু অন্তর্ভুক্ত করেছেন তাহলে server.contextPath=/appNameতাই এখন আমার application.properties মধ্যে শাটডাউন কমান্ড পরিণত হবে: curl -X POST localhost:8080/appName/shutdown হোপ এটি অন্য কারো সাহায্য করতে পারে। এই ভুলের কারণে আমাকে অনেক লড়াই করতে হয়েছিল।
নবীন কুমার

স্প্রিং বুট 1.5.8 এর সাথে এটি প্রস্তাবিত হয়, যদি সুরক্ষা ব্যতীত, অ্যাপ্লিকেশন p প্রপার্টি থাকে endpoints.shutdown.enabled=true management.security.enabled=false
স্টেফানো স্কর্পান্তি

আপনি যদি শেষ পয়েন্টটি প্রকাশ করতে চান না এবং শেল স্ক্রিপ্টের মাধ্যমে থামতে এবং শুরু করতে পিআইডি ফাইলটি ব্যবহার করতে চান না, তাহলে এটি চেষ্টা করুন: stackoverflow.com/questions/26547532/…
আনন্দ বার্কি ফিলিপস

27

পিআইডি ফাইলে লেখার জন্য আপনি স্প্রিংবুট অ্যাপ্লিকেশনটি তৈরি করতে পারেন এবং আপনি পিড ফাইলটি থামাতে বা পুনরায় চালু করতে বা ব্যাশ স্ক্রিপ্ট ব্যবহার করে স্থিতি পেতে পারেন। কোনও ফাইলে পিআইডি লিখতে, নিচের মত প্রদর্শিত অ্যাপ্লিকেশন পিডফাইওয়্যারাইটার ব্যবহার করে স্প্রিং অ্যাপ্লিকেশনটিতে শ্রোতার নিবন্ধন করুন:

SpringApplication application = new SpringApplication(Application.class);
application.addListeners(new ApplicationPidFileWriter("./bin/app.pid"));
application.run();

তারপরে বসন্ত বুট অ্যাপ্লিকেশনটি চালানোর জন্য একটি বাশ স্ক্রিপ্ট লিখুন। রেফারেন্স

এখন আপনি স্ক্রিপ্টটি শুরু করতে, থামাতে বা পুনরায় চালু করতে ব্যবহার করতে পারেন।


জেনেরিক এবং জেনকিন্সের সামঞ্জস্যপূর্ণ সম্পূর্ণ শুরু এবং স্টপ শেল স্ক্রিপ্টটি এখানে পাওয়া যাবে ( স্ট্যাকওভারফ্লো.com / উকশনস / ২654৫753232২/২ )
আনন্দ ভার্কি ফিলিপস


14

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

@PreDestroyআপনাকে পৃথক মটরশুটিতে শাটডাউন কোড চালানোর অনুমতি দেয়। আরও কিছু পরিশীলিত চেহারা দেখতে এটির মতো হবে:

@Component
public class ApplicationShutdown implements ApplicationListener<ContextClosedEvent> {
     @Autowired ... //various components and services

     @Override
     public void onApplicationEvent(ContextClosedEvent event) {
         service1.changeHeartBeatMessage(); // allows loadbalancers & clusters to prepare for the impending shutdown
         service2.deregisterQueueListeners();
         service3.finishProcessingTasksAtHand();
         service2.reportFailedTasks();
         service4.gracefullyShutdownNativeSystemProcessesThatMayHaveBeenLaunched(); 
         service1.eventLogGracefulShutdownComplete();
     }
}

এটি কেবল আমার প্রয়োজন ছিল। অ্যাপ্লিকেশনটি সম্পাদন করার পরে, সিটিআরএল-সি টিপুন ধন্যবাদ মিচাল
মস্কোসো

8

আমি কোনও শেষ পয়েন্ট প্রকাশ করি না এবং প্রারম্ভিক ( পটভূমিতে নোহুপ সহ এবং নোহুপের মাধ্যমে তৈরি ফাইলগুলি ছাড়াই ) এবং শেল স্ক্রিপ্ট দিয়ে থামি ( কিল পিআইডি দিয়ে কৃপণভাবে এবং 3 মিনিটের পরেও অ্যাপটি চলতে থাকলে জোর করে হত্যা করুন )। আমি কেবল এক্সিকিউটেবল জার তৈরি করি এবং পিআইডি ফাইল লেখার জন্য পিআইডি ফাইল লেখক ব্যবহার করি এবং অ্যাপ্লিকেশন নাম এবং শেল স্ক্রিপ্টগুলির একই নাম দিয়ে ফোল্ডারে জার এবং পিড সংরক্ষণ করি এবং শেষে এবং স্টপ সহ একই নাম থাকে। আমি এই স্টপ স্ক্রিপ্টটিকে কল করি এবং জেনকিনস পাইপলাইনের মাধ্যমে স্ক্রিপ্ট শুরু করি। এখন পর্যন্ত কোনও সমস্যা নেই। 8 টি অ্যাপ্লিকেশনের জন্য নিখুঁতভাবে কাজ করা (খুব জেনেরিক স্ক্রিপ্ট এবং যে কোনও অ্যাপ্লিকেশনের জন্য আবেদন করা সহজ)।

মেইন ক্লাস

@SpringBootApplication
public class MyApplication {

    public static final void main(String[] args) {
        SpringApplicationBuilder app = new SpringApplicationBuilder(MyApplication.class);
        app.build().addListeners(new ApplicationPidFileWriter());
        app.run();
    }
}

ওয়াইএমএল ফাইল

spring.pid.fail-on-write-error: true
spring.pid.file: /server-path-with-folder-as-app-name-for-ID/appName/appName.pid

এখানে শুরু স্ক্রিপ্ট (start-appname.sh):

#Active Profile(YAML)
ACTIVE_PROFILE="preprod"
# JVM Parameters and Spring boot initialization parameters
JVM_PARAM="-Xms512m -Xmx1024m -Dspring.profiles.active=${ACTIVE_PROFILE} -Dcom.webmethods.jms.clientIDSharing=true"
# Base Folder Path like "/folder/packages"
CURRENT_DIR=$(readlink -f "$0")
BASE_PACKAGE="${CURRENT_DIR%/bin/*}"
# Shell Script file name after removing path like "start-yaml-validator.sh"
SHELL_SCRIPT_FILE_NAME=$(basename -- "$0")
# Shell Script file name after removing extension like "start-yaml-validator"
SHELL_SCRIPT_FILE_NAME_WITHOUT_EXT="${SHELL_SCRIPT_FILE_NAME%.sh}"
# App name after removing start/stop strings like "yaml-validator"
APP_NAME=${SHELL_SCRIPT_FILE_NAME_WITHOUT_EXT#start-}

PIDS=`ps aux |grep [j]ava.*-Dspring.profiles.active=$ACTIVE_PROFILE.*$APP_NAME.*jar | awk {'print $2'}`
if [ -z "$PIDS" ]; then
  echo "No instances of $APP_NAME with profile:$ACTIVE_PROFILE is running..." 1>&2
else
  for PROCESS_ID in $PIDS; do
        echo "Please stop the process($PROCESS_ID) using the shell script: stop-$APP_NAME.sh"
  done
  exit 1
fi

# Preparing the java home path for execution
JAVA_EXEC='/usr/bin/java'
# Java Executable - Jar Path Obtained from latest file in directory
JAVA_APP=$(ls -t $BASE_PACKAGE/apps/$APP_NAME/$APP_NAME*.jar | head -n1)
# To execute the application.
FINAL_EXEC="$JAVA_EXEC $JVM_PARAM -jar $JAVA_APP"
# Making executable command using tilde symbol and running completely detached from terminal
`nohup $FINAL_EXEC  </dev/null >/dev/null 2>&1 &`
echo "$APP_NAME start script is  completed."

এখানে স্টপ স্ক্রিপ্ট (স্টপ-অ্যাপনেস.শ):

#Active Profile(YAML)
ACTIVE_PROFILE="preprod"
#Base Folder Path like "/folder/packages"
CURRENT_DIR=$(readlink -f "$0")
BASE_PACKAGE="${CURRENT_DIR%/bin/*}"
# Shell Script file name after removing path like "start-yaml-validator.sh"
SHELL_SCRIPT_FILE_NAME=$(basename -- "$0")
# Shell Script file name after removing extension like "start-yaml-validator"
SHELL_SCRIPT_FILE_NAME_WITHOUT_EXT="${SHELL_SCRIPT_FILE_NAME%.*}"
# App name after removing start/stop strings like "yaml-validator"
APP_NAME=${SHELL_SCRIPT_FILE_NAME_WITHOUT_EXT:5}

# Script to stop the application
PID_PATH="$BASE_PACKAGE/config/$APP_NAME/$APP_NAME.pid"

if [ ! -f "$PID_PATH" ]; then
   echo "Process Id FilePath($PID_PATH) Not found"
else
    PROCESS_ID=`cat $PID_PATH`
    if [ ! -e /proc/$PROCESS_ID -a /proc/$PROCESS_ID/exe ]; then
        echo "$APP_NAME was not running with PROCESS_ID:$PROCESS_ID.";
    else
        kill $PROCESS_ID;
        echo "Gracefully stopping $APP_NAME with PROCESS_ID:$PROCESS_ID..."
        sleep 5s
    fi
fi
PIDS=`/bin/ps aux |/bin/grep [j]ava.*-Dspring.profiles.active=$ACTIVE_PROFILE.*$APP_NAME.*jar | /bin/awk {'print $2'}`
if [ -z "$PIDS" ]; then
  echo "All instances of $APP_NAME with profile:$ACTIVE_PROFILE has has been successfully stopped now..." 1>&2
else
  for PROCESS_ID in $PIDS; do
    counter=1
    until [ $counter -gt 150 ]
        do
            if ps -p $PROCESS_ID > /dev/null; then
                echo "Waiting for the process($PROCESS_ID) to finish on it's own for $(( 300 - $(( $counter*5)) ))seconds..."
                sleep 2s
                ((counter++))
            else
                echo "$APP_NAME with PROCESS_ID:$PROCESS_ID is stopped now.."
                exit 0;
            fi
    done
    echo "Forcefully Killing $APP_NAME with PROCESS_ID:$PROCESS_ID."
    kill -9 $PROCESS_ID
  done
fi

7

স্প্রিং বুট অ্যাপ্লিকেশন প্রসঙ্গ তৈরি করার চেষ্টা করার সময় বেশ কয়েকটি অ্যাপ্লিকেশন শ্রোতাদের সরবরাহ করেছিল যার মধ্যে একটি হ'ল অ্যাপ্লিকেশনফেলড এভেন্ট। আমরা আবহাওয়ার জন্য অ্যাপ্লিকেশন প্রসঙ্গটি আরম্ভ করা বা না জানতে পারি।

    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import org.springframework.boot.context.event.ApplicationFailedEvent; 
    import org.springframework.context.ApplicationListener;

    public class ApplicationErrorListener implements 
                    ApplicationListener<ApplicationFailedEvent> {

        private static final Logger LOGGER = 
        LoggerFactory.getLogger(ApplicationErrorListener.class);

        @Override
        public void onApplicationEvent(ApplicationFailedEvent event) {
           if (event.getException() != null) {
                LOGGER.info("!!!!!!Looks like something not working as 
                                expected so stoping application.!!!!!!");
                         event.getApplicationContext().close();
                  System.exit(-1);
           } 
        }
    }

স্প্রিং অ্যাপ্লিকেশনটিতে উপরের শ্রোতাদের শ্রেণিতে যুক্ত করুন।

    new SpringApplicationBuilder(Application.class)
            .listeners(new ApplicationErrorListener())
            .run(args);  

আমি খুঁজে পেয়েছি সেরা উত্তর! ধন্যবাদ!
ভগিফ

[@ ব্যবহারকারী3137438], প্রাক ধ্বংস টীকাটির ভিতরে লগইন করা থেকে এটি কীভাবে আলাদা?
আনন্দ বার্কি ফিলিপস

6

স্প্রিং বুট ২.৩ এবং তার পরে, একটি বিল্ট-ইন গ্রেফুল শটডাউন প্রক্রিয়া রয়েছে।

প্রাক-বসন্ত বুট ২.৩ , বাক্সের বাইরে কোনও চমত্কার শাটডাউন প্রক্রিয়া নেই। কিছু বসন্ত-বুট স্টার্টার এই কার্যকারিতা সরবরাহ করে:

  1. https://github.com/jihor/hiatus-spring-boot
  2. https://github.com/gesellix/graceful-shutdown-spring-boot
  3. https://github.com/corentin59/spring-boot-graceful-shutdown

আমি এনআর এর লেখক। 1. স্টার্টারের নাম দেওয়া হয়েছে "হিয়াইটাস ফর স্প্রিং বুট"। এটি লোড ব্যালেন্সার স্তরে কাজ করে, অর্থাত্ কোনওভাবেই অ্যাপ্লিকেশন প্রসঙ্গে হস্তক্ষেপ না করে কেবল পরিষেবাটিকে OUT_OF_SERVICE হিসাবে চিহ্নিত করে। এটি একটি দৃষ্টিনন্দন শাটডাউন করতে দেয় এবং এর অর্থ হল, প্রয়োজন হলে পরিষেবাটি কিছু সময়ের জন্য পরিষেবা থেকে সরিয়ে নেওয়া যায় এবং তারপরে পুনরায় জীবনে ফিরিয়ে আনা যায়। খারাপ দিকটি এটি জেভিএমকে থামায় না, আপনাকে killকমান্ড দিয়ে এটি করতে হবে । আমি যেমন পাত্রে সবকিছু চালাচ্ছি, এটি আমার পক্ষে কোনও বড় বিষয় ছিল না, কারণ আমাকে যেভাবেই হোক না কেন कंटेनरটি থামাতে হবে এবং সরিয়ে ফেলতে হবে।

অ্যানডি উইলকিনসনের এই পোস্টের উপর ভিত্তি করে সংখ্যা 2 এবং 3 কম বেশি রয়েছে । তারা একমুখী কাজ করে - একবার ট্রিগার হয়ে গেলে তারা শেষ পর্যন্ত প্রসঙ্গটি বন্ধ করে দেয়।


5

স্প্রিং অ্যাপ্লিকেশনটি স্পষ্টভাবে JVM- র সাথে একটি শাটডাউন হুক নিবন্ধভুক্ত করে যাতে অ্যাপ্লিকেশন কনটেক্সটটি প্রস্থান করার সময় নিখুঁতভাবে বন্ধ হয়ে যায় তা নিশ্চিত করে isters এটি এলোচিত সমস্ত বিন পদ্ধতিও কল করবে @PreDestroy। এর অর্থ আমাদের স্পষ্টভাবে কোনও বুট অ্যাপ্লিকেশনটির registerShutdownHook()পদ্ধতি ব্যবহার করতে হবে না ConfigurableApplicationContext, যেমন আমাদের বসন্তের কোর অ্যাপ্লিকেশনটিতে করতে হয়।

@SpringBootConfiguration
public class ExampleMain {
    @Bean
    MyBean myBean() {
        return new MyBean();
    }

    public static void main(String[] args) {
        ApplicationContext context = SpringApplication.run(ExampleMain.class, args);
        MyBean myBean = context.getBean(MyBean.class);
        myBean.doSomething();

        //no need to call context.registerShutdownHook();
    }

    private static class MyBean {

        @PostConstruct
        public void init() {
            System.out.println("init");
        }

        public void doSomething() {
            System.out.println("in doSomething()");
        }

        @PreDestroy
        public void destroy() {
            System.out.println("destroy");
        }
    }
}

এর বিকল্প হিসাবে @PostConstructএবং @PreDestroyআমি টীকাটির মধ্যে initMethodএবং destroyMethodবৈশিষ্ট্যগুলি ব্যবহার করেছি @Bean। এই উদাহরণস্বরূপ তাই: @Bean(initMethod="init", destroyMethod="destroy")
acker9

@PreDestroyকয়েকটি বিকাশকারী সম্পর্কে একটি ক্যাচ হয়ত জানেন না যে, এই জাতীয় পদ্ধতিগুলি কেবল সিঙ্গেলটন স্কোপ সহ মটরশুটি জন্য ডাকা হয়। বিকাশকারীদের অন্যান্য স্কোপগুলির জন্য শিমের জীবনচক্রের পরিষ্কারের অংশটি পরিচালনা করতে হবে

2

তারা একটি বসন্ত অ্যাপ্লিকেশন শাটডাউন করার অনেক উপায়। এক ঘনিষ্ঠ () কল করা হয় ApplicationContext:

ApplicationContext ctx =
    SpringApplication.run(HelloWorldApplication.class, args);
// ...
ctx.close()

আপনার প্রশ্ন আপনাকে পরামর্শ দিয়েছিল যে আপনি নিজের অ্যাপ্লিকেশনটি বন্ধ করে দিতে চান Ctrl+C, এটি প্রায়শই কোনও আদেশ সরিয়ে দেওয়ার জন্য ব্যবহৃত হয়। এক্ষেত্রে...

ব্যবহার endpoints.shutdown.enabled=trueসেরা রেসিপি নয়। এর অর্থ আপনি আপনার অ্যাপ্লিকেশনটি সমাপ্ত করতে একটি শেষ পয়েন্ট প্রকাশ করেছেন। সুতরাং, আপনার ব্যবহারের ক্ষেত্রে এবং আপনার পরিবেশের উপর নির্ভর করে আপনাকে এটি সুরক্ষিত করতে হবে ...

Ctrl+Cআপনার ক্ষেত্রে খুব ভাল কাজ করা উচিত। আমি ধরে নিয়েছি আপনার সমস্যাটি এম্পারস্যান্ড (&) আরও ব্যাখ্যা দ্বারা সৃষ্ট হয়েছে:

একটি স্প্রিং অ্যাপ্লিকেশন প্রসঙ্গে জেভিএম রানটাইম সহ শাটডাউন হুকটি নিবন্ধ করা হতে পারে। অ্যাপ্লিকেশন কনটেক্সট ডকুমেন্টেশন দেখুন ।

আপনারা যেমন বলেছিলেন স্প্রিং বুট এই হুকটি স্বয়ংক্রিয়ভাবে কনফিগার করে কিনা তা আমি জানি না। আমি ধরে নিলাম।

চালু Ctrl+C, আপনার শেলটি INTঅগ্রভাগের অ্যাপ্লিকেশনটিতে একটি সংকেত প্রেরণ করে। এর অর্থ "দয়া করে আপনার মৃত্যুদন্ড কার্যকর করুন" অ্যাপ্লিকেশনটি এই সিগন্যালটিকে ফাঁদে ফেলতে পারে এবং এর সমাপ্তির আগে (স্প্রিং দ্বারা নিবন্ধিত হুক) পরিষ্কার করতে পারে, বা কেবল এটিকে উপেক্ষা করুন (খারাপ)।

nohupহ'ল কমান্ড যা এইচপি সংকেত উপেক্ষা করার জন্য একটি ফাঁদ দিয়ে নিম্নলিখিত প্রোগ্রামটি চালায়। আপনি যখন স্তব্ধ হয়ে থাকেন তখন প্রোগ্রামটি বন্ধ করতে এইচইপি ব্যবহার করা হয় (উদাহরণস্বরূপ আপনার এসএসএস সংযোগটি বন্ধ করুন)। তবুও এটি আউটপুটগুলি পুনর্নির্দেশ করে যাতে আপনার প্রোগ্রামটি নিখোঁজ হওয়া টিটিওয়াইতে অবরুদ্ধ হয়। nohupINT সিগন্যাল উপেক্ষা করে না। সুতরাং এটি Ctrl+Cকাজ করতে বাধা দেয় না ।

আমি ধরে নিই যে আপনার সমস্যাটি অ্যাম্পারস্যান্ড (&) দ্বারা নোহাপের দ্বারা নয়। Ctrl+Cঅগ্রভূমি প্রক্রিয়াগুলিতে একটি সংকেত প্রেরণ করে। এম্পারস্যান্ডের কারণে আপনার অ্যাপ্লিকেশনটি পটভূমিতে চালিত হবে। একটি সমাধান: করুন

kill -INT pid

ব্যবহার kill -9বা kill -KILLখারাপ কারণ অ্যাপ্লিকেশন (এখানে জেভিএম) করুণভাবে শেষ করতে এটি আটকাতে পারে না।

অন্য সমাধান হ'ল আপনার অ্যাপ্লিকেশনটিকে অগ্রভাগে ফিরিয়ে আনা। তাহলে Ctrl+Cকাজ হবে। আরও সুনির্দিষ্টভাবে, ব্যাশ জব নিয়ন্ত্রণে একবার দেখুন fg


2

exit()আপনার বসন্তের বুট অ্যাপ্লিকেশনটি কৃপণভাবে বন্ধ করার জন্য স্প্রিং অ্যাপ্লিকেশন ক্লাসে স্থির পদ্ধতিটি ব্যবহার করুন ।

public class SomeClass {
    @Autowire
    private ApplicationContext context

    public void close() {
        SpringApplication.exit(context);
    }
}

এটি আমার পক্ষে কাজ করে। তোমাকে অনেক ধন্যবাদ.
খচর্নচিট গানসাগাঁ

1

স্প্রিং বুট এখন গ্রেফিউস শাট ডাউনকে সমর্থন করে (বর্তমানে প্রাক-প্রকাশের সংস্করণগুলিতে, ২.৩.০. বিল্ড-এসএনএপশট)

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

আপনি এটি দিয়ে সক্ষম করতে পারেন:

server.shutdown.grace-period=30s

https://docs.spring.io/spring-boot/docs/2.3.0.BUILD-SNAPSHOT/reference/html/spring-boot-features.html#boot-features-graceful-shutdown


0

আপনি যদি ম্যাভেন ব্যবহার করছেন আপনি মাভেন অ্যাপ এসেম্বলারের প্লাগইন ব্যবহার করতে পারেন ।

ডেমন মোজো (যা জেএসডাব্লু এম্বেড করে ) শুরু / স্টপ আর্গুমেন্টের সাথে একটি শেল স্ক্রিপ্ট আউটপুট দেয়। এটি stopআপনার বসন্ত অ্যাপ্লিকেশনটিকে গ্রেপ্তার করে বন্ধ করবে / হত্যা করবে /

লিনাক্স পরিষেবা হিসাবে আপনার মেভেন অ্যাপ্লিকেশনটি ব্যবহার করতে একই স্ক্রিপ্ট ব্যবহার করা যেতে পারে।


0

আপনি যদি একটি লিনাক্স পরিবেশে থাকেন তবে আপনাকে যা করতে হবে তা হ'ল /etc/init.d/ এর ভিতরে থেকে আপনার .jar ফাইলটিতে একটি সিমলিংক তৈরি করা is

sudo ln -s /path/to/your/myboot-app.jar /etc/init.d/myboot-app

তারপরে আপনি অ্যাপ্লিকেশনটি অন্য যে কোনও পরিষেবার মতো শুরু করতে পারেন

sudo /etc/init.d/myboot-app start

অ্যাপ্লিকেশন বন্ধ করতে

sudo /etc/init.d/myboot-app stop

আপনি যখন টার্মিনাল থেকে প্রস্থান করবেন তখন এইভাবে, অ্যাপ্লিকেশনটি শেষ হবে না। এবং অ্যাপ্লিকেশনটি স্টপ কমান্ডের সাথে গ্রেপ্তার হয়ে শাটডাউন করবে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.