欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Spring?Boot?RestController接口輸出到終端的操作代碼

 更新時(shí)間:2023年09月26日 08:58:46   作者:飛鳥_Asuka  
這篇文章主要介紹了Spring?Boot?RestController接口如何輸出到終端,使用?HttpServletResponse?類,可以在使用curl執(zhí)行?Spring?Boot?REST接口的同時(shí),在控制臺(tái)輸出一些信息,給運(yùn)維人員知道當(dāng)前命令執(zhí)行的狀態(tài),感興趣的朋友跟隨小編一起看看吧

背景

公司項(xiàng)目的批處理微服務(wù),一般是在晚上固定時(shí)段通過定時(shí)任務(wù)執(zhí)行,但為了預(yù)防執(zhí)行失敗,我們定義了對(duì)應(yīng)的應(yīng)急接口,必要時(shí)可以通過運(yùn)維在終端中進(jìn)行curl操作。然而,部分任務(wù)耗時(shí)較長,curl命令執(zhí)行后長時(shí)間沒有輸出,如果不查看日志,無法知道系統(tǒng)當(dāng)前的狀態(tài),因此有必要研究一下如何在curl命令調(diào)用接口時(shí),在終端輸出部分信息,已告知運(yùn)維人員當(dāng)前命令的執(zhí)行狀態(tài)。

原理

使用 HttpServletResponse 類,可以自定義輸出,也就是模擬網(wǎng)頁輸出的效果,只不過我們輸出的內(nèi)容是純文本。

代碼

  • 新建一個(gè)Spring Boot項(xiàng)目,建立一個(gè) TestController,作為我們的應(yīng)急接口。
@RestController
@Slf4j
public class EmergencyController {
    @Resource
    private TestService testService;
    @GetMapping("/test")
    public void test(HttpServletResponse response) throws IOException {
        response.setContentType("text/plain;charset=utf-8");
        try {
            boolean result = testService.emergencyOperation(response);
            response.getWriter().println(CommonResult.success(null, "應(yīng)急任務(wù)處理成功!").toString());
        } catch (IOException e) {
            log.error("應(yīng)急任務(wù)處理失?。?, e);
            response.getWriter().println(CommonResult.fail(null, "應(yīng)急任務(wù)處理失敗!").toString());
        }
    }
}

這里的一個(gè)坑是:如果使用了這種方法輸出,那么接口方法不能再有任何返回值,不然會(huì)讓Spring Boot以為重復(fù)調(diào)用了 response.getWriter() 函數(shù),于是報(bào)錯(cuò)。需要將原本的輸出內(nèi)容(如通用返回體CommonResult類,或字符串String)也放入 response.getWriter() 進(jìn)行輸出。

其中 TestService 是我們的批處理業(yè)務(wù)接口,無論是應(yīng)急接口還是定時(shí)任務(wù),都需要使用該接口進(jìn)行實(shí)際的業(yè)務(wù)操作。其實(shí)現(xiàn)類 TestServiceImpl 代碼如下:

/**
 * 模擬應(yīng)急操作方法
 */
@Override
public boolean emergencyOperation(HttpServletResponse response) throws IOException {
    // 如果是定時(shí)任務(wù),則該參數(shù)傳入null,不在終端輸出
    boolean canOutput = response != null;
    PrintWriter writer = createPrintWriter(canOutput, response);
    log.info("開始執(zhí)行應(yīng)急操作任務(wù)");
    output(canOutput, writer, "開始執(zhí)行應(yīng)急操作任務(wù)");
    for (int i = 0; i < 20; i++) {
        output(canOutput, writer, "完成第" + (i+1) + "批次");
        log.info("完成第 {} 批次", i+1);
        try {
            Thread.sleep(500L);
        } catch (InterruptedException e) {
            log.warn("應(yīng)急操作任務(wù)失敗");
            output(canOutput, writer, "應(yīng)急操作任務(wù)失敗");
            return false;
        }
    }
    log.info("完成應(yīng)急操作任務(wù)");
    output(canOutput, writer, "應(yīng)急操作任務(wù)完成");
    return true;
}

其中 createPrintWriter() 方法設(shè)置 HttpServletResponse 對(duì)象的 ContentType 屬性,我們輸出的是純文本,因此需要設(shè)置為 text/plain;charset=utf-8,具體代碼如下:

private PrintWriter createPrintWriter(boolean output, HttpServletResponse response) throws IOException {
    if (output) {
        response.setCharacterEncoding("UTF-8");
        response.setContentType("text/plain;charset=utf-8");
        return response.getWriter();
    }
    return null;
}

在需要使用的地方調(diào)用 output() 方法,向控制臺(tái)打印輸出內(nèi)容:

private void output(boolean output, PrintWriter writer, String message) throws IOException {
    if (!output) {
        return;
    }
    writer.println(message);
    writer.flush();
}

測試

使用 Maven 構(gòu)建項(xiàng)目,在項(xiàng)目生成目錄下運(yùn)行 jar 包啟動(dòng)程序,另外開一個(gè)控制臺(tái)窗口,執(zhí)行 curl http://localhost:8080/test,可以看到控制臺(tái)輸出如下:

同時(shí)在運(yùn)行 Spring Boot 應(yīng)用的窗口,也可以看到日志成功輸出:

定時(shí)任務(wù)執(zhí)行情況

我們定義定時(shí)任務(wù) EmergencyTask 如下(不要忘了在應(yīng)用啟動(dòng)類上增加 @EnableScheduling 注解)

@Component
@Slf4j
public class EmergencyTask {
    @Resource
    private TestService testService;
    @Scheduled(cron = "0 */5 22 * * MON-FRI")
    public void emergencyTask() throws IOException {
        testService.emergencyOperation(null);
    }
}

這里我們?cè)O(shè)置的是從22點(diǎn)后每隔5分鐘執(zhí)行一次,當(dāng)然實(shí)際項(xiàng)目中需要根據(jù)需求來確定定時(shí)任務(wù)執(zhí)行時(shí)間。
啟動(dòng)應(yīng)用,等5分鐘,可以看到定時(shí)任務(wù)成功執(zhí)行。

再次運(yùn)行 curl http://localhost:8080/test,可以看到控制臺(tái)和日志均正常輸出。

總結(jié)

使用 HttpServletResponse 類,可以在使用 curl 執(zhí)行 Spring Boot REST接口的同時(shí),在控制臺(tái)輸出一些信息,給運(yùn)維人員知道當(dāng)前命令執(zhí)行的狀態(tài)。

到此這篇關(guān)于Spring Boot RestController接口輸出到終端的操作代碼的文章就介紹到這了,更多相關(guān)Spring Boot RestController接口內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • java?百度手寫文字識(shí)別接口配置代碼

    java?百度手寫文字識(shí)別接口配置代碼

    本文通過實(shí)例代碼給大家介紹了java?百度手寫文字識(shí)別接口配置方法,代碼簡單易懂,對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    2022-01-01
  • Java IO流相關(guān)知識(shí)代碼解析

    Java IO流相關(guān)知識(shí)代碼解析

    這篇文章主要介紹了Java IO流相關(guān)知識(shí)代碼解析,具有一定借鑒價(jià)值,需要的朋友可以參考下。
    2017-12-12
  • springboot之Duration(java.time.Duration)在yml properties中的配置方式

    springboot之Duration(java.time.Duration)在yml properties中

    這篇文章主要介紹了springboot之Duration(java.time.Duration)在yml properties中的配置方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-12-12
  • Java中由substring方法引發(fā)的內(nèi)存泄漏詳解

    Java中由substring方法引發(fā)的內(nèi)存泄漏詳解

    這篇文章主要介紹了Java中由substring方法引發(fā)的內(nèi)存泄漏詳解,涉及substring方法引發(fā)的內(nèi)存泄漏簡介,substring的作用和實(shí)現(xiàn)原理等相關(guān)內(nèi)容,具有一定借鑒價(jià)值,需要的朋友可以參考下
    2017-12-12
  • Java?數(shù)據(jù)結(jié)構(gòu)進(jìn)階二叉樹題集下

    Java?數(shù)據(jù)結(jié)構(gòu)進(jìn)階二叉樹題集下

    二叉樹可以簡單理解為對(duì)于一個(gè)節(jié)點(diǎn)來說,最多擁有一個(gè)上級(jí)節(jié)點(diǎn),同時(shí)最多具備左右兩個(gè)下級(jí)節(jié)點(diǎn)的數(shù)據(jù)結(jié)構(gòu)。本文將帶你通過實(shí)際題目來熟練掌握
    2022-04-04
  • Java基于迭代器模式實(shí)現(xiàn)的訪問人員列表操作示例

    Java基于迭代器模式實(shí)現(xiàn)的訪問人員列表操作示例

    這篇文章主要介紹了Java基于迭代器模式實(shí)現(xiàn)的訪問人員列表操作,簡單描述了迭代器模式的概念、原理以及使用迭代器模式實(shí)現(xiàn)訪問人員列表的相關(guān)操作技巧,需要的朋友可以參考下
    2018-05-05
  • SpringMVC實(shí)現(xiàn)表單驗(yàn)證功能詳解

    SpringMVC實(shí)現(xiàn)表單驗(yàn)證功能詳解

    這篇文章主要為大家詳細(xì)介紹了SpringMVC 表單驗(yàn)證的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-10-10
  • 關(guān)于jpa中無法刪除onetomany中many問題的解決

    關(guān)于jpa中無法刪除onetomany中many問題的解決

    這篇文章主要介紹了關(guān)于jpa中無法刪除onetomany中many問題的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-12-12
  • Springboot使用Security實(shí)現(xiàn)OAuth2授權(quán)驗(yàn)證完整過程

    Springboot使用Security實(shí)現(xiàn)OAuth2授權(quán)驗(yàn)證完整過程

    安全管理是軟件系統(tǒng)必不可少的的功能。根據(jù)經(jīng)典的“墨菲定律”——凡是可能,總會(huì)發(fā)生。如果系統(tǒng)存在安全隱患,最終必然會(huì)出現(xiàn)問題,這篇文章主要介紹了SpringBoot使用Security實(shí)現(xiàn)OAuth2授權(quán)驗(yàn)證完整過程
    2022-12-12
  • Java使用BouncyCastle加密

    Java使用BouncyCastle加密

    本文主要介紹了Java使用BouncyCastle加密,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-06-06

最新評(píng)論