c语言sscanf函数的用法是什么
248
2023-01-10
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
System.out.println("主线程开始:" + Thread.currentThread() + "==>" + System.currentTimeMillis());
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
public static void save(DeferredResult
queue.add(deferredResult);
}
public static DeferredResult
return queue.poll();
}
}
/createOrder请求会暂时保存DeferredResultQueue中,/create请求会获取DeferredResultQueue中的请求,进行业务逻辑的处理并返回结果
@Controller
public class AsyncController {
@ResponseBody
@RequestMapping("/createOrder")
public DeferredResult
DeferredResult
DeferredResultQueue.save(deferredResult);
return deferredResult;
}
@ResponseBody
@RequestMapping("/create")
public String create(){
String order = UUID.randomUUID().toString();
DeferredResult
deferredResult.setResult(order);
return "success:" + order;
}
}
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~