日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當前位置:首頁 > 科技  > 軟件

優化SpringBoot吞吐量的七個高效策略

來源: 責編: 時間:2024-06-28 17:15:11 199觀看
導讀1、異步執行實現方式二種:使用異步注解 @aysnc、啟動類:添加 @EnableAsync 注解JDK 8 本身有一個非常好用的 Future 類——CompletableFuture@AllArgsConstructorpublic class AskThread implements Runnable{ priva

1、異步執行eUo28資訊網——每日最新資訊28at.com

實現方式二種:eUo28資訊網——每日最新資訊28at.com

  • 使用異步注解 @aysnc、啟動類:添加 @EnableAsync 注解
  • JDK 8 本身有一個非常好用的 Future 類——CompletableFuture
@AllArgsConstructorpublic class AskThread implements Runnable{    private CompletableFuture<Integer> re = null;    public void run() {        int myRe = 0;        try {            myRe = re.get() * re.get();        } catch (Exception e) {            e.printStackTrace();        }        System.out.println(myRe);    }    public static void main(String[] args) throws InterruptedException {        final CompletableFuture<Integer> future = new CompletableFuture<>();        new Thread(new AskThread(future)).start();        //模擬長時間的計算過程        Thread.sleep(1000);        //告知完成結果        future.complete(60);    }}

在該示例中,啟動一個線程,此時 AskThread 對象還沒有拿到它需要的數據,執行到  myRe = re.get() * re.get() 會阻塞。eUo28資訊網——每日最新資訊28at.com

我們用休眠 1 秒來模擬一個長時間的計算過程,并將計算結果告訴 future 執行結果,AskThread 線程將會繼續執行。eUo28資訊網——每日最新資訊28at.com

public class Calc {    public static Integer calc(Integer para) {        try {            //模擬一個長時間的執行            Thread.sleep(1000);        } catch (InterruptedException e) {            e.printStackTrace();        }        return para * para;    }    public static void main(String[] args) throws ExecutionException, InterruptedException {        final CompletableFuture<Void> future = CompletableFuture.supplyAsync(() -> calc(50))                .thenApply((i) -> Integer.toString(i))                .thenApply((str) -> "/"" + str + "/"")                .thenAccept(System.out::println);        future.get();    }}

CompletableFuture.supplyAsync 方法構造一個 CompletableFuture 實例,在 supplyAsync() 方法中,它會在一個新線程中,執行傳入的參數。eUo28資訊網——每日最新資訊28at.com

在這里它會執行 calc() 方法,這個方法可能是比較慢的,但這并不影響 CompletableFuture 實例的構造速度,supplyAsync() 會立即返回。eUo28資訊網——每日最新資訊28at.com

而返回的 CompletableFuture 實例就可以作為這次調用的契約,在將來任何場合,用于獲得最終的計算結果。eUo28資訊網——每日最新資訊28at.com

supplyAsync 用于提供返回值的情況,CompletableFuture 還有一個不需要返回值的異步調用方法 runAsync(Runnable runnable),一般我們在優化 Controller 時,使用這個方法比較多。eUo28資訊網——每日最新資訊28at.com

這兩個方法如果在不指定線程池的情況下,都是在 ForkJoinPool.common 線程池中執行,而這個線程池中的所有線程都是 Daemon(守護)線程,所以,當主線程結束時,這些線程無論執行完畢都會退出系統。eUo28資訊網——每日最新資訊28at.com

核心代碼:eUo28資訊網——每日最新資訊28at.com

CompletableFuture.runAsync(() ->   this.afterBetProcessor(betRequest,betDetailResult,appUser,id));

異步調用使用 Callable 來實現:eUo28資訊網——每日最新資訊28at.com

@RestController  public class HelloController {    private static final Logger logger = LoggerFactory.getLogger(HelloController.class);    @Autowired      private HelloService hello;    @GetMapping("/helloworld")    public String helloWorldController() {        return hello.sayHello();    }    /**     * 異步調用restful     * 當controller返回值是Callable的時候,springmvc就會啟動一個線程將Callable交給TaskExecutor去處理     * 然后DispatcherServlet還有所有的spring攔截器都退出主線程,然后把response保持打開的狀態     * 當Callable執行結束之后,springmvc就會重新啟動分配一個request請求,然后DispatcherServlet就重新     * 調用和處理Callable異步執行的返回結果, 然后返回視圖     *     * @return     */      @GetMapping("/hello")    public Callable<String> helloController() {        logger.info(Thread.currentThread().getName() + " 進入helloController方法");        Callable<String> callable = new Callable<String>() {            @Override              public String call() throws Exception {                logger.info(Thread.currentThread().getName() + " 進入call方法");                String say = hello.sayHello();                logger.info(Thread.currentThread().getName() + " 從helloService方法返回");                return say;            }        };        logger.info(Thread.currentThread().getName() + " 從helloController方法返回");        return callable;    }}

異步調用的方式 WebAsyncTask:eUo28資訊網——每日最新資訊28at.com

@RestController  public class HelloController {    private static final Logger logger = LoggerFactory.getLogger(HelloController.class);    @Autowired      private HelloService hello;    /**     * 帶超時時間的異步請求 通過WebAsyncTask自定義客戶端超時間     * @return     */      @GetMapping("/world")    public WebAsyncTask<String> worldController() {        logger.info(Thread.currentThread().getName() + " 進入helloController方法");        // 3s鐘沒返回,則認為超時        WebAsyncTask<String> webAsyncTask = new WebAsyncTask<>(3000, new Callable<String>() {            @Override              public String call() throws Exception {                logger.info(Thread.currentThread().getName() + " 進入call方法");                String say = hello.sayHello();                logger.info(Thread.currentThread().getName() + " 從helloService方法返回");                return say;            }        });        logger.info(Thread.currentThread().getName() + " 從helloController方法返回");        webAsyncTask.onCompletion(new Runnable() {            @Override              public void run() {                logger.info(Thread.currentThread().getName() + " 執行完畢");            }        });        webAsyncTask.onTimeout(new Callable<String>() {            @Override              public String call() throws Exception {                logger.info(Thread.currentThread().getName() + " onTimeout");                // 超時的時候,直接拋異常,讓外層統一處理超時異常                throw new TimeoutException("調用超時");            }        });        return webAsyncTask;    }    /**     * 異步調用,異常處理,詳細的處理流程見MyExceptionHandler類     * @return     */      @GetMapping("/exception")    public WebAsyncTask<String> exceptionController() {        logger.info(Thread.currentThread().getName() + " 進入helloController方法");        Callable<String> callable = new Callable<String>() {            @Override              public String call() throws Exception {                logger.info(Thread.currentThread().getName() + " 進入call方法");                throw new TimeoutException("調用超時!");            }        };        logger.info(Thread.currentThread().getName() + " 從helloController方法返回");        return new WebAsyncTask<>(20000, callable);    }}


eUo28資訊網——每日最新資訊28at.com

2、增加內嵌 Tomcat 的最大連接數eUo28資訊網——每日最新資訊28at.com

代碼如下:eUo28資訊網——每日最新資訊28at.com

@Configurationpublic class TomcatConfig {    @Bean    public ConfigurableServletWebServerFactory webServerFactory() {        TomcatServletWebServerFactory tomcatFactory = new TomcatServletWebServerFactory();        tomcatFactory.addConnectorCustomizers(new MyTomcatConnectorCustomizer());        tomcatFactory.setPort(8005);        tomcatFactory.setContextPath("/api-g");        return tomcatFactory;    }    class MyTomcatConnectorCustomizer implements TomcatConnectorCustomizer {        public void customize(Connector connector) {            Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();            //設置最大連接數            protocol.setMaxConnections(20000);            //設置最大線程數            protocol.setMaxThreads(2000);            protocol.setConnectionTimeout(30000);        }    }}

3、使用 @ComponentScan()eUo28資訊網——每日最新資訊28at.com

使用 @ComponentScan() 定位掃包比 @SpringBootApplication 掃包更快。eUo28資訊網——每日最新資訊28at.com

4、默認 Tomcat 容器改為 UndertoweUo28資訊網——每日最新資訊28at.com

默認 Tomcat 容器改為 Undertow(Jboss 下的服務器,Tomcat 吞吐量 5000,Undertow 吞吐量 8000)eUo28資訊網——每日最新資訊28at.com

<exclusions>  <exclusion>     <groupId>org.springframework.boot</groupId>     <artifactId>spring-boot-starter-tomcat</artifactId>  </exclusion></exclusions>

改為:eUo28資訊網——每日最新資訊28at.com

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

5、使用 BufferedWriter 進行緩沖eUo28資訊網——每日最新資訊28at.com

這里不給大家舉例,可自行嘗試。eUo28資訊網——每日最新資訊28at.com

6、Deferred 方式實現異步調用eUo28資訊網——每日最新資訊28at.com

代碼如下:eUo28資訊網——每日最新資訊28at.com

@RestControllerpublic class AsyncDeferredController {    private final Logger logger = LoggerFactory.getLogger(this.getClass());    private final LongTimeTask taskService;    @Autowired    public AsyncDeferredController(LongTimeTask taskService) {        this.taskService = taskService;    }    @GetMapping("/deferred")    public DeferredResult<String> executeSlowTask() {        logger.info(Thread.currentThread().getName() + "進入executeSlowTask方法");        DeferredResult<String> deferredResult = new DeferredResult<>();        // 調用長時間執行任務        taskService.execute(deferredResult);        // 當長時間任務中使用deferred.setResult("world");這個方法時,會從長時間任務中返回,繼續controller里面的流程        logger.info(Thread.currentThread().getName() + "從executeSlowTask方法返回");        // 超時的回調方法        deferredResult.onTimeout(new Runnable(){   @Override   public void run() {    logger.info(Thread.currentThread().getName() + " onTimeout");    // 返回超時信息    deferredResult.setErrorResult("time out!");   }  });        // 處理完成的回調方法,無論是超時還是處理成功,都會進入這個回調方法        deferredResult.onCompletion(new Runnable(){   @Override   public void run() {    logger.info(Thread.currentThread().getName() + " onCompletion");   }  });        return deferredResult;    }}

7、異步調用可以使用 AsyncHandlerInterceptor 進行攔截eUo28資訊網——每日最新資訊28at.com

代碼如下:eUo28資訊網——每日最新資訊28at.com

@Componentpublic class MyAsyncHandlerInterceptor implements AsyncHandlerInterceptor { private static final Logger logger = LoggerFactory.getLogger(MyAsyncHandlerInterceptor.class); @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)   throws Exception {  return true; } @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,   ModelAndView modelAndView) throws Exception {// HandlerMethod handlerMethod = (HandlerMethod) handler;  logger.info(Thread.currentThread().getName()+ "服務調用完成,返回結果給客戶端"); } @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)   throws Exception {  if(null != ex){   System.out.println("發生異常:"+ex.getMessage());  } } @Override public void afterConcurrentHandlingStarted(HttpServletRequest request, HttpServletResponse response, Object handler)   throws Exception {  // 攔截之后,重新寫回數據,將原來的hello world換成如下字符串  String resp = "my name is chhliu!";  response.setContentLength(resp.length());  response.getOutputStream().write(resp.getBytes());  logger.info(Thread.currentThread().getName() + " 進入afterConcurrentHandlingStarted方法"); }}


eUo28資訊網——每日最新資訊28at.com

本文鏈接:http://m.www897cc.com/showinfo-26-97290-0.html優化SpringBoot吞吐量的七個高效策略

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: 列表大揭秘:一文掌握 Python 列表的高級玩法

下一篇: C#/.NET這些實用的技巧和知識點你都知道嗎?

標簽:
  • 熱門焦點
Top 日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不
免费美女久久99| 欧美在线影院| 亚洲精品极品| 一区二区三区 在线观看视| 亚洲一区综合| 久久久91精品国产一区二区三区| 另类成人小视频在线| 欧美日韩黄视频| 亚洲欧美另类中文字幕| 亚洲一区二区高清视频| 欧美一区二区视频在线观看2020 | 久久在精品线影院精品国产| 欧美激情一区三区| 国产精品亚洲一区二区三区在线| 黄色成人在线网址| 一区二区欧美亚洲| 久久都是精品| 欧美日韩国产一中文字不卡| 国产一区欧美| 一区二区精品| 久久久综合激的五月天| 欧美午夜免费影院| 亚洲第一色在线| 亚洲制服欧美中文字幕中文字幕| 快播亚洲色图| 国产精品久久久久9999高清| 亚洲高清色综合| 香蕉久久夜色精品| 欧美激情久久久久久| 国产一区二区三区免费不卡| 99re6热只有精品免费观看| 久久久国产精品一区二区三区| 欧美丝袜一区二区| 91久久精品国产91久久| 午夜精品一区二区在线观看| 欧美精品激情| 伊人天天综合| 午夜精品婷婷| 欧美日韩免费视频| 亚洲国产成人高清精品| 午夜精品福利电影| 欧美日韩在线精品| 91久久一区二区| 久久久亚洲国产天美传媒修理工| 国产精品亚洲精品| 一区二区精品在线| 欧美风情在线| 影音先锋亚洲视频| 欧美有码在线观看视频| 国产精品久久久久久户外露出| 亚洲全部视频| 美女精品网站| 黄色成人av网| 欧美一级久久| 国产精品日韩欧美一区二区| 日韩一区二区电影网| 欧美国产一区视频在线观看| 一色屋精品视频免费看| 欧美有码视频| 国产精品亚洲产品| 亚洲伊人久久综合| 欧美性猛交视频| 99视频超级精品| 欧美国产精品久久| 亚洲欧洲三级| 牛人盗摄一区二区三区视频| 韩日视频一区| 久久国产直播| 国产午夜精品在线| 欧美一级黄色网| 国产欧美另类| 午夜精品久久久久久久久久久久 | 美女在线一区二区| 国内一区二区三区在线视频| 欧美在线视频一区二区| 国产美女精品视频免费观看| 午夜国产精品视频| 国产精品久久久久久av下载红粉| 一区二区三区精品国产| 欧美日韩国产影院| 国产精品99久久久久久白浆小说| 欧美三级电影大全| 一本大道av伊人久久综合| 欧美日韩综合久久| 亚洲视频在线观看免费| 国产精品久久久久久久一区探花| 亚洲一区二区在线视频| 欧美性猛交一区二区三区精品| 亚洲图片欧美一区| 国产精品久久网| 欧美一二区视频| 国产在线欧美日韩| 麻豆成人在线观看| 最新成人在线| 欧美日韩一区在线播放| 亚洲男人的天堂在线aⅴ视频| 国产精品自在欧美一区| 久久久精品久久久久| 在线观看亚洲| 欧美人牲a欧美精品| 亚洲一区二区三区免费观看 | 欧美激情综合五月色丁香| 夜夜嗨av一区二区三区中文字幕 | 欧美成人国产| 一级日韩一区在线观看| 国产精品日韩欧美一区二区| 久久xxxx精品视频| 亚洲国产精品久久久久婷婷884 | 欧美激情综合亚洲一二区| 亚洲免费av片| 国产精品毛片高清在线完整版| 欧美有码在线视频| 亚洲国产美女久久久久| 欧美日韩在线免费视频| 欧美一级片久久久久久久| 在线观看91久久久久久| 欧美日韩hd| 香蕉视频成人在线观看| 在线日韩中文字幕| 欧美午夜电影完整版| 欧美一二三视频| 亚洲日本中文字幕| 国产精品日韩电影| 久久一区二区三区四区| 99综合视频| 国产一区欧美日韩| 欧美日韩精品免费| 久久精品国产精品亚洲综合| 亚洲人在线视频| 国产欧美日韩在线| 欧美国产日韩一区| 亚洲欧美日韩天堂| 亚洲电影欧美电影有声小说| 国产精品夫妻自拍| 老司机67194精品线观看| 在线视频精品一区| 精品成人免费| 国产精品v亚洲精品v日韩精品 | 欧美日韩中文精品| 久久亚洲一区二区| 亚洲欧美国产日韩天堂区| 亚洲国产裸拍裸体视频在线观看乱了中文 | 999亚洲国产精| 国语自产在线不卡| 国产精品久久7| 欧美sm重口味系列视频在线观看| 亚洲欧美网站| 亚洲精品你懂的| 国语自产精品视频在线看抢先版结局 | 国产欧美日韩亚洲精品| 欧美日本精品一区二区三区| 久久精品亚洲国产奇米99| 亚洲视频香蕉人妖| 亚洲国产乱码最新视频| 国产欧美欧洲在线观看| 欧美日韩美女在线| 免费在线亚洲| 久久激五月天综合精品| 中国日韩欧美久久久久久久久| 亚洲国产另类 国产精品国产免费| 国产精品揄拍500视频| 欧美日韩岛国| 久热这里只精品99re8久| 性做久久久久久久久| 在线一区免费观看| 亚洲日本中文字幕区| 在线免费高清一区二区三区| 国产日韩精品一区观看| 国产精品国产精品国产专区不蜜| 欧美国产综合| 欧美成人网在线| 久久久午夜视频| 欧美一区二区免费观在线| 亚洲一区www| 一区二区高清在线| 亚洲精品视频在线| 亚洲黄色影院| 亚洲国产精品久久人人爱蜜臀| 伊人春色精品| 激情综合视频| 国内外成人免费视频| 国产一区二区精品丝袜| 国产欧美精品在线播放| 国产伦一区二区三区色一情| 国产精品分类| 国产精品久久久久久久午夜片| 欧美性色视频在线| 欧美日韩综合在线| 欧美日韩一区三区| 欧美日韩在线第一页| 欧美日韩一区二区视频在线观看| 欧美精品电影在线| 欧美精品久久一区| 午夜亚洲一区| 国产精品亚洲综合| 久久九九99视频| 国产精品人人做人人爽| 一区二区高清在线观看| 欧美日韩aaaaa| 亚洲高清一二三区| 欧美日韩在线观看一区二区| 欧美日韩精品一区二区在线播放| 久久综合图片| 午夜宅男欧美|