最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

背景

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

原理

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

代碼

  • 新建一個Spring Boot項目,建立一個 TestController,作為我們的應急接口。
@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, "應急任務處理成功!").toString());
        } catch (IOException e) {
            log.error("應急任務處理失?。?, e);
            response.getWriter().println(CommonResult.fail(null, "應急任務處理失敗!").toString());
        }
    }
}

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

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

/**
 * 模擬應急操作方法
 */
@Override
public boolean emergencyOperation(HttpServletResponse response) throws IOException {
    // 如果是定時任務,則該參數(shù)傳入null,不在終端輸出
    boolean canOutput = response != null;
    PrintWriter writer = createPrintWriter(canOutput, response);
    log.info("開始執(zhí)行應急操作任務");
    output(canOutput, writer, "開始執(zhí)行應急操作任務");
    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("應急操作任務失敗");
            output(canOutput, writer, "應急操作任務失敗");
            return false;
        }
    }
    log.info("完成應急操作任務");
    output(canOutput, writer, "應急操作任務完成");
    return true;
}

其中 createPrintWriter() 方法設置 HttpServletResponse 對象的 ContentType 屬性,我們輸出的是純文本,因此需要設置為 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() 方法,向控制臺打印輸出內(nèi)容:

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

測試

使用 Maven 構建項目,在項目生成目錄下運行 jar 包啟動程序,另外開一個控制臺窗口,執(zhí)行 curl http://localhost:8080/test,可以看到控制臺輸出如下:

同時在運行 Spring Boot 應用的窗口,也可以看到日志成功輸出:

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

我們定義定時任務 EmergencyTask 如下(不要忘了在應用啟動類上增加 @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);
    }
}

這里我們設置的是從22點后每隔5分鐘執(zhí)行一次,當然實際項目中需要根據(jù)需求來確定定時任務執(zhí)行時間。
啟動應用,等5分鐘,可以看到定時任務成功執(zhí)行。

再次運行 curl http://localhost:8080/test,可以看到控制臺和日志均正常輸出。

總結

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

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

相關文章

  • Java中不用第三個變量來互換兩個變量的值

    Java中不用第三個變量來互換兩個變量的值

    在程序運行期間,隨時可能產(chǎn)生一些臨時數(shù)據(jù),應用程序會將這些數(shù)據(jù)保存在一些內(nèi)存單元中,每個內(nèi)存單元都用一個標識符來標識。這些內(nèi)存單元被稱為變量,定義的標識符就是變量名,內(nèi)存單元中存儲的數(shù)據(jù)就是變量的值
    2021-10-10
  • 以Spring Boot的方式顯示圖片或下載文件到瀏覽器的示例代碼

    以Spring Boot的方式顯示圖片或下載文件到瀏覽器的示例代碼

    這篇文章主要介紹了以Spring Boot的方式顯示圖片或下載文件到瀏覽器的示例代碼,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-01-01
  • springboot中spring.profiles.include的妙用分享

    springboot中spring.profiles.include的妙用分享

    這篇文章主要介紹了springboot中spring.profiles.include的妙用,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-08-08
  • Maven添加reactor依賴失敗的解決方案

    Maven添加reactor依賴失敗的解決方案

    起初是自己在學spring boot3,結果到了reactor這一部分的時候,在項目的pom.xml文件中添加下列依賴報錯,接下來通過本文給大家介紹Maven添加reactor依賴失敗的解決方案,需要的朋友可以參考下
    2024-06-06
  • 解決spring結合mybatis時一級緩存失效的問題

    解決spring結合mybatis時一級緩存失效的問題

    這篇文章主要介紹了解決spring結合mybatis時一級緩存失效的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-11-11
  • java中的編碼轉換過程(以utf8和gbk為例)

    java中的編碼轉換過程(以utf8和gbk為例)

    這篇文章主要介紹了java中的編碼轉換過程(以utf8和gbk為例),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-04-04
  • Shiro中session超時頁面跳轉的處理方式

    Shiro中session超時頁面跳轉的處理方式

    這篇文章主要介紹了Shiro中session超時頁面跳轉的處理方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-06-06
  • Datagram Scoket雙向通信

    Datagram Scoket雙向通信

    這篇文章主要介紹了Datagram Scoket雙向通信,需要的朋友可以參考下
    2014-04-04
  • Java中如何判斷是否為閏年詳細實例

    Java中如何判斷是否為閏年詳細實例

    所謂閏年就是指2月有29天的那一年,下面這篇文章主要給大家介紹了關于Java中如何判斷是否為閏年的相關資料,文中通過圖文以及實例代碼介紹的非常詳細,需要的朋友可以參考下
    2023-06-06
  • 利用Java連接Hadoop進行編程

    利用Java連接Hadoop進行編程

    這篇文章主要介紹了利用Java連接Hadoop進行編程,文章圍繞主題展開詳細的內(nèi)容介紹,具有一定的參考價值,感興趣的小伙伴可以參考一下
    2022-06-06

最新評論

开远市| 岫岩| 韶关市| 浦县| 侯马市| 兴仁县| 孙吴县| 宁阳县| 霍城县| 大化| 嵩明县| 塔城市| 城步| 绵阳市| 瑞金市| 通州市| 古浪县| 易门县| 盐边县| 靖远县| 太白县| 汉中市| 大丰市| 永善县| 静乐县| 来凤县| 连山| 临江市| 义马市| 奎屯市| 霍山县| 治多县| 舒城县| 麻城市| 广元市| 鹤庆县| 河北省| 津南区| 北宁市| 沭阳县| 平阳县|