Spring中注解方式的异步请求

网友投稿 702 2023-01-13

Spring中注解方式的异步请求

Spring中注解方式的异步请求

一、Servlet3.0异步请求

@WebServlet(value = "/async", asyncSupported = true)

public class HelloAsyncServlet extends HttpServlet {

@Override

protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOExceptiohttp://n {

//1、设置支持异步处理asyncSupported = true

//2、开启异步模式

System.out.println("主线程开始:" + Thread.currentThread() + "==>" + System.currentTimeMillis());

AsyncContext startAsync = req.startAsync();

//3、业务逻辑进行异步处理,开始异步处理

startAsync.start(new Runnable() {

@Override

public void run() {

try {

System.out.println("副线程开始:" + Thread.currentThread() + "==>" + System.currentTimeMillis());

sayHello();

//获取到异步的上下文

AsyncContext asyncContext = req.getAsyncContext();

startAsync.complete();

ServletResponse response = asyncContext.getResponse();

response.getWriter().write("hello async!");

System.out.println("副线程结束:" + Thread.currentThread() + "==>" + System.currentTimeMillis());

} catch (Exception e) {

e.printStackTrace();

}

}

});

System.out.println("主线程结束:" + Thread.currentThread() + "==>" + System.currentTimeMillis());

}

public void sayHello() throws Exception {

System.out.println(Thread.currentThread() + "processing...");

Thread.sleep(3000);

}

}

打印结果:

二、SpringMVC的异步请求

返回Callable

@Controller

public class AsyncController {

@ResponseBody

@RequestMapping("/async01")

public Callable async01(){

System.out.println("主线程开始:" + Thread.currentThread() + "==>" + System.currentTimeMillis());

Callable callable = new Callable() {

public String call() throws Exception {

System.out.println("副线程开始:" + Thread.currentThread() + "==>" + System.currentTimeMillis());

Thread.sleep(2000);

System.out.println("副线程开始:" + Thread.currentThread() + "==>" + System.currentTimeMillis());

return "async01";

}

};

System.out.println("主线程结束:" + Thread.currentThread() + "==>" + System.currentTimeMillis());

return callable;

}

}

控制器返回Callable

Spring进行异步处理,将Callable提交给TaskExecutor,使用一个隔离的线程进行执行

DispatcherServlet和所有的Filter退出Web容器的线程,但是response保持打开状态

Callable返回结果,SpreingMVC将请求重新派发给容器,恢复之前的处理,Callable返回值就是目标方法的返回值

根据Callable返回的结果,SpringMVC继续进行视图渲染流程等(从收到请求到视图渲染)

输出结果:

返回DeferredResult

模拟一个消息中间件

public class DeferredResultQueue {

private static Queue> queue = new ConcurrentLinkedDeque>();

public static void save(DeferredResult deferredResult){

queue.add(deferredResult);

}

public static DeferredResult get(){

return queue.poll();

}

}

/createOrder请求会暂时保存DeferredResultQueue中,/create请求会获取DeferredResultQueue中的请求,进行业务逻辑的处理并返回结果

@Controller

public class AsyncController {

@ResponseBody

@RequestMapping("/createOrder")

public DeferredResult createOrder(){

DeferredResult deferredResult = new DeferredResult((long)3000,"create fail");

DeferredResultQueue.save(deferredResult);

return deferredResult;

}

@ResponseBody

@RequestMapping("/create")

public String create(){

String order = UUID.randomUUID().toString();

DeferredResult deferredResult = DeferredResultQueue.get();

deferredResult.setResult(order);

return "success:" + order;

}

}

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:银行小程序推广宣传文案(银行服务宣传文案)
下一篇:金融小程序会被叫停吗(小程序会关闭吗)
相关文章

 发表评论

暂时没有评论,来抢沙发吧~