技术要点
org.springframework.web.context.request.async.DeferredResult
示例如下:
1. 新建Maven项目 async
2. pom.xml
4.0.0 com.java async1.0.0 org.springframework.boot spring-boot-starter-parent2.0.5.RELEASE org.springframework.boot spring-boot-starter-weborg.springframework springloaded1.2.8.RELEASE provided org.springframework.boot spring-boot-devtoolsprovided ${project.artifactId} org.apache.maven.plugins maven-compiler-plugin1.8 1.8 UTF-8 org.springframework.boot spring-boot-maven-pluginrepackage
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
9. 运行 AsyncStarter.java ,启动测试
浏览器输入 http://localhost:8080/order?number=10001
正常情况处理3秒返回,返回结果如下
{"time":1548241500718,"params":"10001"}
观察控制台打印日志,如下所示:
[ OrderController ] 接到下单请求 当前待处理订单数: 0 [ OrderController ] 返回下单结果 [ OrderTask ]开始处理订单 [ OrderTask ]订单处理完成
结论:Controller层几乎在接收到请求的同时就已经返回,处理程序在后台异步处理任务。
快速多次刷新浏览器,目的为了高并发测试,观察控制台打印信息
现象:Controller层快速返回,待处理请求在队列中开始增加,异步处理程序在按顺序处理请求。
优点:对客户端响应时间不变,但提高了服务端的吞吐量。大大提升高并发处理性能!
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持考高分网。



