成人无码视频,亚洲精品久久久久av无码,午夜精品久久久久久毛片,亚洲 中文字幕 日韩 无码

資訊專欄INFORMATION COLUMN

spring boot學(xué)習(xí)(5): 進程exit code自定義

張巨偉 / 2534人閱讀

摘要:用于應(yīng)用發(fā)生不可調(diào)整的異常,導(dǎo)致應(yīng)用退出的情況。聲明如下使用方式通過來注冊,當(dāng)應(yīng)用發(fā)生異常時,會調(diào)用每個的實現(xiàn)類。取值前后正負(fù)不同,取最新相同,取絕對值大的。

在線上環(huán)境中,應(yīng)用可能因為一些異常而終止,我們?nèi)绻枰皶r找到原因,根據(jù) exit code 來定位,是個很好的途徑。 spring boot 為開發(fā)者提供了相關(guān)的接口,方便開發(fā)者通過異常類型來定義自己的 exit codeExitCodeGeneratorExitCodeExceptionMapper.

1. ExitCodeGenerator:

用于主動退出應(yīng)用,在 SpringApplication.exit(org.springframework.context.ApplicationContext,ExitCodeGenerator..)中用到,該方法會尋找所有的 ExitCodeGeneratorBean, 也會用到方法中的入?yún)ο蟆?/p>

ExitCodeGenerator 聲明如下:

@FunctionalInterface
public interface ExitCodeGenerator {

    /**
     * Returns the exit code that should be returned from the application.
     * @return the exit code.
     */
    int getExitCode();

}
1.1 使用:

System.exit(SpringApplication.exit(SpringApplication.run(DemoApplication.class, args)));

@SpringBootApplication
public class DemoApplication{

    @Bean
    public ExitCoder getTestExitCoder(){
        return new ExitCoder();
    }

    @Bean
    public ExitCoder1 getTestExitCoder1(){
        return new ExitCoder1();
    }


    public static void main(String[] args) {
        System.exit(SpringApplication.exit(SpringApplication.run(DemoApplication.class, args)));
    }
}
import org.springframework.boot.ExitCodeGenerator;


public class ExitCoder implements ExitCodeGenerator {
    @Override
    public int getExitCode() {
        System.out.println("get exit code from class: ExitCoder");
        return 222;
    }
}
import org.springframework.boot.ExitCodeGenerator;

public class ExitCoder1 implements ExitCodeGenerator {
    @Override
    public int getExitCode() {
        System.out.println("get exit code from class: ExitCoder1");
        return 221;
    }
}

輸出為

2019-03-21 21:52:55.802  INFO 44627 --- [           main] com.example.exitcode.DemoApplication     : Starting DemoApplication on lei.local with PID 44627 (/Users/lei/own/projects/java_learning/spring_boot_learning/blog/5exitcode/exitcode/out/production/classes started by lei in /Users/lei/own/projects/java_learning/spring_boot_learning/blog/5exitcode/exitcode)
2019-03-21 21:52:55.806  INFO 44627 --- [           main] com.example.exitcode.DemoApplication     : No active profile set, falling back to default profiles: default
2019-03-21 21:52:56.339  INFO 44627 --- [           main] com.example.exitcode.DemoApplication     : Started DemoApplication in 15.901 seconds (JVM running for 21.676)
get exit code from class: ExitCoder
get exit code from class: ExitCoder1
Disconnected from the target VM, address: "127.0.0.1:50873", transport: "socket"

Process finished with exit code 222

從上面可以看到,以 exit code 最大的為最終值。

2. ExitCodeExceptionMapper

用于應(yīng)用發(fā)生不可調(diào)整的異常,導(dǎo)致應(yīng)用退出的情況。聲明如下:

@FunctionalInterface
public interface ExitCodeExceptionMapper {

    /**
     * Returns the exit code that should be returned from the application.
     * @param exception the exception causing the application to exit
     * @return the exit code or {@code 0}.
     */
    int getExitCode(Throwable exception);

}
2.1 使用方式

通過 Bean 來注冊,當(dāng)應(yīng)用發(fā)生異常時,會調(diào)用每個ExitCodeExceptionMapper 的實現(xiàn)類。這里,我們可以根據(jù)異常類型來設(shè)置自己的 exit code:

@SpringBootApplication
public class DemoApplication{
    @Bean
    public DemoExitCodeExceptionMapper getExitCodeMapper(){
        return new DemoExitCodeExceptionMapper();
    }

    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }


    @Bean
    CommandLineRunner showUsers() {
        return args -> {throw new Exception("xxxxx");};
    }
}
public class DemoExitCodeExceptionMapper implements ExitCodeExceptionMapper{
    /**
     * Returns the exit code that should be returned from the application.
     * @param exception the exception causing the application to exit
     * @return the exit code or {@code 0}.
     */
    @Override
    public int getExitCode(Throwable exception){
        System.out.println("exit cod xxxx" + exception.getMessage());
        if(exception.getCause().getMessage().equals("sdf")){
            return 254;
        }
        return 243;
    }
}

運行輸出為:

2019-03-21 22:13:34.261  INFO 45049 --- [           main] com.example.exitcode.DemoApplication     : Started DemoApplication in 15.816 seconds (JVM running for 21.521)
exit cod xxxxFailed to execute CommandLineRunner
2019-03-21 22:13:38.797  INFO 45049 --- [           main] ConditionEvaluationReportLoggingListener : 

Error starting ApplicationContext. To display the conditions report re-run your application with "debug" enabled.
2019-03-21 22:13:38.845 ERROR 45049 --- [           main] o.s.boot.SpringApplication               : Application run failed

java.lang.IllegalStateException: Failed to execute CommandLineRunner
    at org.springframework.boot.SpringApplication.callRunner(SpringApplication.java:816) [spring-boot-2.1.3.RELEASE.jar:2.1.3.RELEASE]
    at org.springframework.boot.SpringApplication.callRunners(SpringApplication.java:797) [spring-boot-2.1.3.RELEASE.jar:2.1.3.RELEASE]
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:324) [spring-boot-2.1.3.RELEASE.jar:2.1.3.RELEASE]
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:1260) [spring-boot-2.1.3.RELEASE.jar:2.1.3.RELEASE]
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:1248) [spring-boot-2.1.3.RELEASE.jar:2.1.3.RELEASE]
    at com.example.exitcode.DemoApplication.main(DemoApplication.java:31) [classes/:na]
Caused by: java.lang.Exception: xxxxx
    at com.example.exitcode.DemoApplication.lambda$showUsers$0(DemoApplication.java:37) [classes/:na]
    at org.springframework.boot.SpringApplication.callRunner(SpringApplication.java:813) [spring-boot-2.1.3.RELEASE.jar:2.1.3.RELEASE]
    ... 5 common frames omitted

Disconnected from the target VM, address: "127.0.0.1:51237", transport: "socket"

Process finished with exit code 243
3. 取值邏輯
public int getExitCode() {
    int exitCode = 0;
    for (ExitCodeGenerator generator : this.generators) {
        try {
            int value = generator.getExitCode();
            if (value > 0 && value > exitCode || value < 0 && value < exitCode) {
                exitCode = value;
            }
        }
        catch (Exception ex) {
            exitCode = (exitCode != 0) ? exitCode : 1;
            ex.printStackTrace();
        }
    }
    return exitCode;
}

第一個: 直接取第一個的值。

2....n-1,n: nn-1 正負(fù)不同,取 n, 相同,取絕對值大的。

4.總結(jié):

主動調(diào)用SpringApplication.exit 方法使用ExitCodeGenerator ,可以通過 Bean注冊,也可通過傳值。

應(yīng)用異常退出使用 ExitCodeExceptionMapper, 只能通過 Bean 注冊使用。

取值:
前后正負(fù)不同,取最新, 相同,取絕對值大的。

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://m.hztianpu.com/yun/73840.html

相關(guān)文章

  • Spring Boot - 定義啟動banner

    摘要:背景這段時間較忙,有些想念小紅,為了表達我對小紅的思念之情,決定將啟動的研究一下,看看是否能夠自定義,讓我天天能夠看到她。 背景 這段時間較忙,有些想念小紅,為了表達我對小紅的思念之情,決定將spring boot啟動的banner研究一下,看看是否能夠自定義,讓我天天能夠看到她。 展示 經(jīng)過調(diào)研,發(fā)現(xiàn)自定義banner是一個輕松愉快的過程,忍不住讓我多啟動幾次,先看看效果:(省略了一...

    CollinPeng 評論0 收藏0
  • 慕課網(wǎng)_《Kafka流處理平臺》學(xué)習(xí)總結(jié)

    摘要:慕課網(wǎng)流處理平臺學(xué)習(xí)總結(jié)時間年月日星期日說明本文部分內(nèi)容均來自慕課網(wǎng)。 慕課網(wǎng)《Kafka流處理平臺》學(xué)習(xí)總結(jié) 時間:2018年09月09日星期日 說明:本文部分內(nèi)容均來自慕課網(wǎng)。@慕課網(wǎng):https://www.imooc.com 教學(xué)源碼:無 學(xué)習(xí)源碼:https://github.com/zccodere/s... 第一章:課程介紹 1-1 課程介紹 課程介紹 Kafk...

    Maxiye 評論0 收藏0
  • 基于Shiro,JWT實現(xiàn)微信小程序登錄完整例子

    摘要:小程序官方流程圖如下,官方地址如果此圖理解不清楚的地方也可參看我的博客本文是對接微信小程序自定義登錄的一個完整例子實現(xiàn),技術(shù)棧為。調(diào)用微信接口獲取和根據(jù)和自定義登陸態(tài)返回自定義登陸態(tài)給小程序端。 小程序官方流程圖如下,官方地址 : https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/login....

    cfanr 評論0 收藏0

發(fā)表評論

0條評論

張巨偉

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<