<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      Spring Boot RestController接口如何輸出到終端

      今天在公司項目的代碼上實踐了一下,發現這種方法對業務代碼侵入性太大,大量的業務方法需要增加傳入參數,使得業務方法和HttpServletResponse類耦合度太高,需要將業務和輸出解耦,具體實現請看下一篇文章 使用HttpServletResponse實現curl接口時控制臺輸出(續)

      背景

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

      原理

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

      代碼

      1. 新建一個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以為重復調用了 response.getWriter() 函數,于是報錯。需要將原本的輸出內容(如通用返回體CommonResult類,或字符串String)也放入 response.getWriter() 進行輸出。

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

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

      在需要使用的地方調用 output() 方法,向控制臺打印輸出內容:

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

      測試

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

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

      定時任務執行情況

      我們定義定時任務 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分鐘執行一次,當然實際項目中需要根據需求來確定定時任務執行時間。
      啟動應用,等5分鐘,可以看到定時任務成功執行。

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

      總結

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

      posted @ 2023-09-25 22:34  飛鳥_Asuka  閱讀(755)  評論(5)    收藏  舉報
      主站蜘蛛池模板: 国产精品亚洲二区在线看| 日韩精品一区二区三区激情视频| 国产成人精品18| 成人免费无码大片A毛片抽搐色欲| 高h纯肉无码视频在线观看| 激情六月丁香婷婷四房播| 成人伊人青草久久综合网| 国产精品深夜福利免费观看| 黄色A级国产免费大片视频| 日韩欧激情一区二区三区| 99久久精品费精品国产一区二| 美女内射毛片在线看免费人动物 | 亚洲护士一区二区三区| 亚洲av高清一区二区三| 国产jizzjizz视频| 中文字幕人妻中文AV不卡专区| 国产高清乱码又大又圆| 在线观看亚洲精品国产| 国产一区二区三区av在线无码观看| 熟女人妻aⅴ一区二区三区电影| 欧美国产成人精品二区芒果视频| 上蔡县| 欧美级特黄aaaaaa片| 国产国拍亚洲精品永久软件| 色欲aⅴ亚洲情无码av蜜桃| 夜夜嗨久久人成在日日夜夜| 国产gaysexchina男外卖| 毛葺葺老太做受视频| 日韩精品毛片一区到三区| 国产在线国偷精品免费看| 欧美zoozzooz性欧美| 久久伊99综合婷婷久久伊| 亚洲大尺度视频在线播放| 肉大榛一进一出免费视频| 国产精品人妻| 国产亚洲精品成人aa片新蒲金| 久久国产精品免费一区| 九九热精品在线免费视频| 日韩精品国产中文字幕| 久久香蕉国产线看观看猫咪av| 国产精品爽爽va在线观看网站|