栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Springboot实现高吞吐量异步处理详解(适用于高并发场景)

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Springboot实现高吞吐量异步处理详解(适用于高并发场景)

技术要点

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

示例如下:

1.   新建Maven项目  async

2.   pom.xml




  4.0.0
  com.java
  async
  1.0.0

  
    org.springframework.boot
    spring-boot-starter-parent
    2.0.5.RELEASE
  


  

    
    
      org.springframework.boot
      spring-boot-starter-web
    


    
    
      org.springframework
      springloaded
      1.2.8.RELEASE
      provided
    
    
      org.springframework.boot
      spring-boot-devtools
      provided
    

  

  
    ${project.artifactId}
    
      
 org.apache.maven.plugins
 maven-compiler-plugin
 
   1.8
   1.8
   UTF-8
 
      

      
 org.springframework.boot
 spring-boot-maven-plugin
 
   
     
repackage
     
   
 
      
    
  

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;


public class AsyncVo {

  
  private I params;

  
  private DeferredResult result;

  public I getParams() {
    return params;
  }

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

  public DeferredResult getResult() {
    return result;
  }

  public void setResult(DeferredResult 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;


@Component
public class RequestQueue {

  
  private BlockingQueue> orderQueue = new linkedBlockingQueue<>(50);

  public BlockingQueue> 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;


@Component
public class OrderTask extends Thread {

  @Autowired
  private RequestQueue queue;

  private boolean running = true;

  @Override
  public void run() {
    while (running) {
      try {
 AsyncVo vo = queue.getOrderQueue().take();
 System.out.println("[ OrderTask ]开始处理订单");

 String params = vo.getParams();
 Thread.sleep(3000);
 Map 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;


@Component
public class QueueListener {

  @Autowired
  private OrderTask orderTask;

  
  @PostConstruct
  public void init() {
    orderTask.start();
  }

  
  @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;


@RestController
public class OrderController {

  @Autowired
  private RequestQueue queue;

  @GetMapping("/order")
  public DeferredResult order(String number) throws InterruptedException {
    System.out.println("[ OrderController ] 接到下单请求");
    System.out.println("当前待处理订单数: " + queue.getOrderQueue().size());

    AsyncVo vo = new AsyncVo<>();
    DeferredResult result = new DeferredResult<>();

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

    queue.getOrderQueue().put(vo);
    System.out.println("[ OrderController ] 返回下单结果");
    return result;
  }
}

 9.   运行 AsyncStarter.java ,启动测试

浏览器输入 http://localhost:8080/order?number=10001

正常情况处理3秒返回,返回结果如下

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

观察控制台打印日志,如下所示:

[ OrderController ] 接到下单请求
当前待处理订单数: 0
[ OrderController ] 返回下单结果
[ OrderTask ]开始处理订单
[ OrderTask ]订单处理完成

结论:Controller层几乎在接收到请求的同时就已经返回,处理程序在后台异步处理任务。 

快速多次刷新浏览器,目的为了高并发测试,观察控制台打印信息

现象:Controller层快速返回,待处理请求在队列中开始增加,异步处理程序在按顺序处理请求。

优点:对客户端响应时间不变,但提高了服务端的吞吐量。大大提升高并发处理性能!

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持考高分网。

转载请注明:文章转载自 www.mshxw.com
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号