189 8069 5689

Springboot中怎么实现高吞吐量异步处理

Springboot中怎么实现高吞吐量异步处理,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。

成都创新互联专业为企业提供北屯网站建设、北屯做网站、北屯网站设计、北屯网站制作等企业网站建设、网页设计与制作、北屯企业网站模板建站服务,十年北屯做网站经验,不只是建网站,更提供有价值的思路和整体网络服务。

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;@SpringBootApplicationpublic 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;/** * 存储异步处理信息 *  * @author Logen * * @param 接口输入参数 * @param 接口返回参数 */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;/** * 存放所有异步处理接口请求队列的对象,一个接口对应一个队列 *  * @author Logen * */@Componentpublic class RequestQueue {  /**   * 处理下订单接口的队列,设置缓冲容量为50   */  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;/** * 处理订单接口的任务,每个任务类处理一种接口 *  * @author Logen * */@Componentpublic 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;/** * 队列监听器,初始化启动所有监听任务 *  * @author Logen * */@Componentpublic 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;/** *

*  *
 *  * 模拟下单处理,实现高吞吐量异步处理请求 *  * 1、 Controller层接口只接收请求,不进行处理,而是把请求信息放入到对应该接口的请求队列中 * 2、 该接口对应的任务类监听对应接口的请求队列,从队列中顺序取出请求信息并进行处理 *  * 优点:接口几乎在收到请求的同时就已经返回,处理程序在后台异步进行处理,大大提高吞吐量 *  *  * 
*  *
*  * @author Logen * */@RestControllerpublic 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层快速返回,待处理请求在队列中开始增加,异步处理程序在按顺序处理请求。

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

关于Springboot中怎么实现高吞吐量异步处理问题的解答就分享到这里了,希望以上内容可以对大家有一定的帮助,如果你还有很多疑惑没有解开,可以关注创新互联行业资讯频道了解更多相关知识。


当前文章:Springboot中怎么实现高吞吐量异步处理
文章起源:http://cdxtjz.cn/article/jpggjs.html

联系我们

您好HELLO!
感谢您来到成都网站建设公司,若您有合作意向,请您为我们留言或使用以下方式联系我们, 我们将尽快给你回复,并为您提供真诚的设计服务,谢谢。
  • 电话:028- 86922220 18980695689
  • 商务合作邮箱:631063699@qq.com
  • 合作QQ: 532337155
  • 成都网站设计地址:成都市青羊区锣锅巷31号五金站写字楼6楼

小谭建站工作室

成都小谭网站建设公司拥有多年以上互联网从业经验的团队,始终保持务实的风格,以"帮助客户成功"为已任,专注于提供对客户有价值的服务。 我们已为众企业及上市公司提供专业的网站建设服务。我们不只是一家网站建设的网络公司;我们对营销、技术、管理都有自己独特见解,小谭建站采取“创意+综合+营销”一体化的方式为您提供更专业的服务!

小谭观点

相对传统的成都网站建设公司而言,小谭是互联网中的网站品牌策划,我们精于企业品牌与互联网相结合的整体战略服务。
我们始终认为,网站必须注入企业基因,真正使网站成为企业vi的一部分,让整个网站品牌策划体系变的深入而持久。