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

Springboot實(shí)現(xiàn)高吞吐量異步處理詳解(適用于高并發(fā)場(chǎng)景)

 更新時(shí)間:2019年11月18日 09:29:58   作者:誠信天下  
這篇文章主要介紹了Springboot實(shí)現(xiàn)高吞吐量異步處理詳解(適用于高并發(fā)場(chǎng)景),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

技術(shù)要點(diǎn)

org.springframework.web.context.request.async.DeferredResult<T>

示例如下:

1.   新建Maven項(xiàng)目  async

2.   pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 
    http://maven.apache.org/xsd/maven-4.0.0.xsd">


  <modelVersion>4.0.0</modelVersion>
  <groupId>com.java</groupId>
  <artifactId>async</artifactId>
  <version>1.0.0</version>

  <parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.0.5.RELEASE</version>
  </parent>


  <dependencies>

    <!-- Spring Boot -->
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-web</artifactId>
    </dependency>


    <!-- 熱部署 -->
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>springloaded</artifactId>
      <version>1.2.8.RELEASE</version>
      <scope>provided</scope>
    </dependency>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-devtools</artifactId>
      <scope>provided</scope>
    </dependency>

  </dependencies>

  <build>
    <finalName>${project.artifactId}</finalName>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-compiler-plugin</artifactId>
        <configuration>
          <source>1.8</source>
          <target>1.8</target>
          <encoding>UTF-8</encoding>
        </configuration>
      </plugin>

      <plugin>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-maven-plugin</artifactId>
        <executions>
          <execution>
            <goals>
              <goal>repackage</goal>
            </goals>
          </execution>
        </executions>
      </plugin>
    </plugins>
  </build>
</project>

3.   AsyncStarter.java

package com.java;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class AsyncStarter {

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

4.   AsyncVo.java

package com.java.vo;

import org.springframework.web.context.request.async.DeferredResult;

/**
 * 存儲(chǔ)異步處理信息
 * 
 * @author Logen
 *
 * @param <I> 接口輸入?yún)?shù)
 * @param <O> 接口返回參數(shù)
 */
public class AsyncVo<I, O> {

  /**
   * 請(qǐng)求參數(shù)
   */
  private I params;

  /**
   * 響應(yīng)結(jié)果
   */
  private DeferredResult<O> result;

  public I getParams() {
    return params;
  }

  public void setParams(I params) {
    this.params = params;
  }

  public DeferredResult<O> getResult() {
    return result;
  }

  public void setResult(DeferredResult<O> result) {
    this.result = result;
  }
}

5.   RequestQueue.java

package com.java.queue;

import java.util.concurrent.BlockingQueue;
import java.util.concurrent.LinkedBlockingQueue;

import org.springframework.stereotype.Component;

import com.java.vo.AsyncVo;

/**
 * 存放所有異步處理接口請(qǐng)求隊(duì)列的對(duì)象,一個(gè)接口對(duì)應(yīng)一個(gè)隊(duì)列
 * 
 * @author Logen
 *
 */
@Component
public class RequestQueue {

  /**
   * 處理下訂單接口的隊(duì)列,設(shè)置緩沖容量為50
   */
  private BlockingQueue<AsyncVo<String, Object>> orderQueue = new LinkedBlockingQueue<>(50);

  public BlockingQueue<AsyncVo<String, Object>> getOrderQueue() {
    return orderQueue;
  }
}

6.   OrderTask.java

package com.java.task;

import java.util.HashMap;
import java.util.Map;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import com.java.queue.RequestQueue;
import com.java.vo.AsyncVo;

/**
 * 處理訂單接口的任務(wù),每個(gè)任務(wù)類處理一種接口
 * 
 * @author Logen
 *
 */
@Component
public class OrderTask extends Thread {

  @Autowired
  private RequestQueue queue;

  private boolean running = true;

  @Override
  public void run() {
    while (running) {
      try {
        AsyncVo<String, Object> vo = queue.getOrderQueue().take();
        System.out.println("[ OrderTask ]開始處理訂單");

        String params = vo.getParams();
        Thread.sleep(3000);
        Map<String, Object> map = new HashMap<>();
        map.put("params", params);
        map.put("time", System.currentTimeMillis());

        vo.getResult().setResult(map);

        System.out.println("[ OrderTask ]訂單處理完成");
      } catch (InterruptedException e) {
        e.printStackTrace();
        running = false;
      }

    }
  }

  public void setRunning(boolean running) {
    this.running = running;
  }
}

7.   QueueListener.java

package com.java.listener;

import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import com.java.task.OrderTask;

/**
 * 隊(duì)列監(jiān)聽器,初始化啟動(dòng)所有監(jiān)聽任務(wù)
 * 
 * @author Logen
 *
 */
@Component
public class QueueListener {

  @Autowired
  private OrderTask orderTask;

  /**
   * 初始化時(shí)啟動(dòng)監(jiān)聽請(qǐng)求隊(duì)列
   */
  @PostConstruct
  public void init() {
    orderTask.start();
  }

  /**
   * 銷毀容器時(shí)停止監(jiān)聽任務(wù)
   */
  @PreDestroy
  public void destory() {
    orderTask.setRunning(false);
  }

}

8.   OrderController.java

package com.java.controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.context.request.async.DeferredResult;

import com.java.queue.RequestQueue;
import com.java.vo.AsyncVo;

/**
 * <blockquote>
 * 
 * <pre>
 * 
 * 模擬下單處理,實(shí)現(xiàn)高吞吐量異步處理請(qǐng)求
 * 
 * 1、 Controller層接口只接收請(qǐng)求,不進(jìn)行處理,而是把請(qǐng)求信息放入到對(duì)應(yīng)該接口的請(qǐng)求隊(duì)列中
 * 2、 該接口對(duì)應(yīng)的任務(wù)類監(jiān)聽對(duì)應(yīng)接口的請(qǐng)求隊(duì)列,從隊(duì)列中順序取出請(qǐng)求信息并進(jìn)行處理
 * 
 * 優(yōu)點(diǎn):接口幾乎在收到請(qǐng)求的同時(shí)就已經(jīng)返回,處理程序在后臺(tái)異步進(jìn)行處理,大大提高吞吐量
 * 
 * 
 * </pre>
 * 
 * </blockquote>
 * 
 * @author Logen
 *
 */
@RestController
public class OrderController {

  @Autowired
  private RequestQueue queue;

  @GetMapping("/order")
  public DeferredResult<Object> order(String number) throws InterruptedException {
    System.out.println("[ OrderController ] 接到下單請(qǐng)求");
    System.out.println("當(dāng)前待處理訂單數(shù): " + queue.getOrderQueue().size());

    AsyncVo<String, Object> vo = new AsyncVo<>();
    DeferredResult<Object> result = new DeferredResult<>();

    vo.setParams(number);
    vo.setResult(result);

    queue.getOrderQueue().put(vo);
    System.out.println("[ OrderController ] 返回下單結(jié)果");
    return result;
  }
}

 9.   運(yùn)行 AsyncStarter.java ,啟動(dòng)測(cè)試

瀏覽器輸入 http://localhost:8080/order?number=10001

正常情況處理3秒返回,返回結(jié)果如下

{"time":1548241500718,"params":"10001"}

觀察控制臺(tái)打印日志,如下所示:

[ OrderController ] 接到下單請(qǐng)求
當(dāng)前待處理訂單數(shù): 0
[ OrderController ] 返回下單結(jié)果
[ OrderTask ]開始處理訂單
[ OrderTask ]訂單處理完成

結(jié)論:Controller層幾乎在接收到請(qǐng)求的同時(shí)就已經(jīng)返回,處理程序在后臺(tái)異步處理任務(wù)。 

快速多次刷新瀏覽器,目的為了高并發(fā)測(cè)試,觀察控制臺(tái)打印信息

現(xiàn)象:Controller層快速返回,待處理請(qǐng)求在隊(duì)列中開始增加,異步處理程序在按順序處理請(qǐng)求。

優(yōu)點(diǎn):對(duì)客戶端響應(yīng)時(shí)間不變,但提高了服務(wù)端的吞吐量。大大提升高并發(fā)處理性能!

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • 詳解如何在Java8中創(chuàng)建和使用線程池

    詳解如何在Java8中創(chuàng)建和使用線程池

    在 Java 8 中,線程池(Thread Pool)是一種管理線程資源的機(jī)制,能夠有效地控制并發(fā)執(zhí)行的線程數(shù)量,減少線程創(chuàng)建和銷毀的開銷,提高系統(tǒng)的性能,本篇文章將詳細(xì)介紹如何在 Java 8 中創(chuàng)建和使用線程池,需要的朋友可以參考下
    2024-06-06
  • SpringBoot項(xiàng)目微信云托管入門部署實(shí)踐

    SpringBoot項(xiàng)目微信云托管入門部署實(shí)踐

    本文主要介紹了SpringBoot項(xiàng)目微信云托管入門部署實(shí)踐,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • 使用springMVC通過Filter實(shí)現(xiàn)防止xss注入

    使用springMVC通過Filter實(shí)現(xiàn)防止xss注入

    這篇文章主要介紹了使用springMVC通過Filter實(shí)現(xiàn)防止xss注入的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • Java實(shí)現(xiàn)LRU緩存算法的參考示例

    Java實(shí)現(xiàn)LRU緩存算法的參考示例

    這篇文章主要介紹了JAVA實(shí)現(xiàn)LRU緩存算法的參考示例,幫助大家根據(jù)需求實(shí)現(xiàn)算法,對(duì)大家的學(xué)習(xí)或工作有一定的參考價(jià)值,需要的朋友可以參考下
    2023-05-05
  • Java編程計(jì)算兔子生兔子的問題

    Java編程計(jì)算兔子生兔子的問題

    古典問題:有一對(duì)兔子,從出生后第3個(gè)月起每個(gè)月都生一對(duì)兔子,小兔子長到第四個(gè)月后每個(gè)月又生一對(duì)兔子,假如兔子都不死,問每個(gè)月的兔子總數(shù)為多少
    2017-02-02
  • java常用工具類之Excel操作類及依賴包下載

    java常用工具類之Excel操作類及依賴包下載

    這篇文章主要介紹了java常用工具類Excel操作類及依賴包下載,需要的朋友可以參考下
    2014-07-07
  • Mybatis全面分頁插件

    Mybatis全面分頁插件

    這篇文章主要為大家詳細(xì)介紹了Mybatis全面分頁插件的使用方法,比較適用于在分頁時(shí)候進(jìn)行攔截,感興趣的小伙伴們可以參考一下
    2016-08-08
  • 基于Mybatis的配置文件入門必看篇

    基于Mybatis的配置文件入門必看篇

    這篇文章主要介紹了Mybatis的配置文件入門,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • 基于slf4j日志MDC輸出格式的問題

    基于slf4j日志MDC輸出格式的問題

    這篇文章主要介紹了基于slf4j日志MDC輸出格式的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-12-12
  • Java入門之集合框架詳解

    Java入門之集合框架詳解

    本文介紹了Java集合框架體系結(jié)構(gòu),包括List、Set和Map接口及其常用實(shí)現(xiàn)類,重點(diǎn)講解了ArrayList、LinkedList、HashSet、TreeSet和HashMap等類的使用方法,并詳細(xì)介紹了泛型的定義和作用,最后,還討論了集合的遍歷和并發(fā)修改異常處理
    2025-01-01

最新評(píng)論

通化市| 新乡县| 华容县| 郧西县| 贵南县| 五河县| 和田市| 英超| 芷江| 威远县| 南开区| 巴塘县| 涞水县| 瑞昌市| 偃师市| 元谋县| 彰化县| 山东| 宾川县| 平谷区| 府谷县| 丘北县| 缙云县| 泊头市| 清流县| 崇州市| 阿拉尔市| 昔阳县| 建德市| 宜章县| 吉林省| 英超| 开化县| 临清市| 肃南| 怀远县| 华容县| 阳朔县| 化隆| 科尔| 长春市|