学习
实践
活动
工具
TVP
写文章

AsyncContext异步请求的用法

AsyncContext介绍 Servlet 3.0的异步处理支持特性,使Servlet 线程不再需要一直阻塞,直到业务处理完毕才能再输出响应,最后才结束该 Servlet 线程。 1.startAsync()会直接利用原有的请求与响应对象来创建AsyncContext 2.startAsync(ServletRequest request,ServletResponse response )可以传入自行创建的请求、响应封装对象; 可以通过AsyncContext的getRequest()、getResponse()方法取得请求、响应对象,此次对客户端的响应将暂缓至调用AsyncContext ); 那这时候就可以使用AsyncContext这个对象了 ? 代码中得到AsyncContext实例之后,就会先释放容器分配给请求的线程与相关资源,然后把把实例放入了一个定时任务里面;等时间到了或者有配置变更之后,调用complete()响应完成 ?

3.8K30

Servlet 3.0 异步处理详解

AsyncContext出现之前,解决这个问题的唯一办法就是扩充Web容器的thread pool。 但是这样依然有一个问题,考虑以下场景: 有一个web容器,线程池大小200。 但是如果使用AsyncContext,我们就可以将耗时的操作交给另一个thread去做,这样HTTP thread就被释放出来了,可以去处理其他请求了。 注意,只有使用AsyncContext才能够达到上面所讲的效果,如果直接new Thread()或者类似的方式的,HTTP thread并不会归还到容器。 AsyncContext.start()的。 不过AsyncContext在某些时候的确能够提高性能,但这个取决于你的代码是怎么写的。

71830
  • 广告
    关闭

    热门业务场景教学

    个人网站、项目部署、开发环境、游戏服务器、图床、渲染训练等免费搭建教程,多款云服务器20元起。

  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    厉害了,Servlet3的异步处理机制


    "); out.flush(); AsyncContext asyncContext = req.startAsync(); asyncContext.addListener (getListener()); asyncContext.start(new IndexThread(asyncContext)); out.println timeout."); } }; } } public class IndexThread implements Runnable { private AsyncContext asyncContext; public IndexThread(AsyncContext asyncContext) { this.asyncContext = asyncContext
    "); out.flush(); asyncContext.complete(); } catch (Exception e)

    456100

    WebFlux学习时常见的问题

    asyncContext = request.startAsync(); ServletInputStream inputStream = request.getInputStream ) throws ServletException, IOException { long t1 = System.currentTimeMillis(); // 开启异步 AsyncContext asyncContext = request.startAsync(); // 执行业务代码(doSomething 指的是处理耗费时间长的方法) CompletableFuture.runAsync (() -> doSomeThing(asyncContext, asyncContext.getRequest (), asyncContext.getResponse())); System.out.println("async use:" + (System.currentTimeMillis()

    40710

    Servlet3.0新特性:异步处理,太好用了!!!

    AsyncContext asyncContext = request.startAsync(request, response); step3:异步处理业务&完成异步处理 其他线程中执行业务操作, 方法来处理请求,传递的是一个 Runnable 对象,asyncContext.start 会将传递的 Runnable 放在新的线程中去执行 asyncContext.start(() -> { AsyncContext asyncContext = request.startAsync(request, response); //3、调用start方法异步处理 asyncContext.setTimeout(1000); //3、调用start方法异步处理,调用这个方法之后主线程就结束了 asyncContext.start(( (毫秒) 设置异步处理监听器:asyncContext.addListener,可以添加多个监听器 完成异步处理的 2 种方式:asyncContext.dispatch() 或 asyncContext.complete

    97650

    servlet异步请求

    (3)、紧接着servlet线程退出(回收到线程池),但是响应response对象仍旧保持打开状态,新增线程会使用AsyncContext处理并响应结果。 asyncContext = req.startAsync(); asyncContext.start(new WeekTask(asyncContext)); //添加监听器 最终是使用该上下文对象来进行异步业务逻辑处理,其中有两个核心方法 asyncContext.start(new WeekTask(asyncContext)); 添加一个异步任务该任务是一个Runnable asyncContext = null; //这里初始化产品任务PmJob、研发任务RDJob 测试任务TestJob public WeekTask(AsyncContext asyncContext ) { this.asyncContext = asyncContext; jobs = new ArrayList<>(); PmJob pmJob = new

    6020

    Java及Dubbo异步编程

    2、服务提供方(Provider) Dubbo支持使用AsyncContext实现异步执行,代码如下: final ThreadPoolExecutor bizThreadpool = new ThreadPoolExecutor new NamedThreadFactory("biz-thread-pool"), new ThreadPoolExecutor.CallerRunsPolicy()); final AsyncContext asyncContext = RpcContext.startAsync(); executor.execute(() -> { //如果要使用上下文,则必须要放在第一句执行 asyncContext.signalContextSwitch(); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } asyncContext.write("Hello " + name + " " + RpcContext.getContext

    16320

    【SpringBoot WEB系列】异步请求知识点与使用姿势小结

    本篇博文作为异步请求的扫盲和使用教程,将包含以下知识点 什么是异步请求,有什么特点,适用场景 四种使用姿势: AsyncContext 方式 Callable WebAsyncTask DeferredResult (path = "get") public void get(HttpServletRequest request) { AsyncContext asyncContext = ; asyncContext.getResponse().setCharacterEncoding("utf-8"); asyncContext.getResponse 添加监听器 asyncContext.addListener(AsyncListener)(这个是可选的) 用户请求开始、超时、异常、完成时回调 设置超时时间 asyncContext.setTimeout (3000L) (可选) 异步任务asyncContext.start(Runnable) 2.

    34930

    聊聊nacos config的doPollingConfig

    String ip = RequestUtil.getRemoteIp(req); // 一定要由HTTP线程调用,否则离开后容器会立即发送响应 final AsyncContext asyncContext = req.startAsync(); // AsyncContext.setTimeout()的超时时间不准,所以只能自己控制 asyncContext.setTimeout (0L); ​ scheduler.execute( new ClientLongPolling(asyncContext, clientMd5Map, ip, (); } } ​ ClientLongPolling(AsyncContext ac, Map<String, String> clientMd5Map asyncContext; final Map<String, String> clientMd5Map; final long createTime;

    35700

    SpringBoot的四种异步处理,写这篇文章,我自己先学到了

    Servlet 3.0的异步是通过AsyncContext对象来完成的,它可以从当前线程传给另一个线程,并归还初始线程。新的线程处理完业务可以直接返回结果给客户端。 request) { AsyncContext asyncContext = request.getAsyncContext(); } 在AsyncContext中提供了获取ServletRequest 通过AsyncContext的addListener还可以添加监听事件,用来处理异步线程的开始、完成、异常、超时等事件回调。 asyncContext = request.startAsync(); // 设置监听器:可设置其开始、完成、异常、超时等事件的回调处理 asyncContext.addListener 内部线程执行完成,AsyncContext的onComplete方法被调用。 如果通过浏览器访问对应的URL,还可以看到该方法的返回值“async processing”。

    82630

    Spring 异步请求

    The call to request.startAsync() returns AsyncContext which can be used for further control over async HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //2、开启异步模式 AsyncContext 3000); startAsync.complete(); //4、获取到异步上下文 AsyncContext asyncContext = req.getAsyncContext(); //5、获取响应 ServletResponse response = asyncContext.getResponse(); response.getWriter().write("hello async..

    5620

    Servlet3.0新特性(从注解配置到websocket编程)

    Servlet3.0中异步处理主要是通过接口AsyncContext来实现的,我们可以通过HttpServletRequest对象来过去该接口的实现对象。 AsyncContext getAsyncContext(); 在使用异步处理之前,我们还需要配置指定当前的servlet是支持异步处理。 这个线程类代码如下: public class MyInfo extends Thread { private AsyncContext asyncContext; public MyInfo (AsyncContext as){ this.asyncContext = as; } @Override public void run(){ (); pw.println("hello walker:"+new Date()+"
    "); asyncContext.complete();

    42490

    Tomcat NIO(20)-异步任务运行

    我们一般有如下代码: public void testAsync(HttpServletRequest request, HttpServletResponse response) { try{ AsyncContext context.complete(); }}); }catch(Exception e){ //Handle exception here } } AsyncContext 运行异步的流程: 对于 AsyncContext.start() 的源码调用序列图如下: ? 从 AsyncContext 的 star() 方法开始,一直调用到 SocketWrapperBase 对象实例的 execute() 方法,这里我们分析 execute() 核心方法: 上述方法首先通过 所以综上总结对于 tomcat 异步原生 API 实现中, AsyncContext.start() 方法会把异步任务交由 tomcat io 线程池运行,这样在大量启动异步任务的时候可能会过度占用 io

    29220

    WebFlux学习时常见的问题

    asyncContext = request.startAsync(); ServletInputStream inputStream = request.getInputStream ) throws ServletException, IOException { long t1 = System.currentTimeMillis(); // 开启异步 AsyncContext asyncContext = request.startAsync(); // 执行业务代码(doSomething 指的是处理耗费时间长的方法) CompletableFuture.runAsync (() -> doSomeThing(asyncContext, asyncContext.getRequest (), asyncContext.getResponse())); System.out.println("async use:" + (System.currentTimeMillis()

    37220

    异步 Servlet 都不懂,谈何 WebFlux?

    asyncContext = request.startAsync(); CompletableFuture.runAsync(() -> printLog(asyncContext, asyncContext.getRequest(),asyncContext.getResponse())); System.out.println("总耗时:" + (System.currentTimeMillis () - start)); } private void printLog(AsyncContext asyncContext, ServletRequest request, ServletResponse 调用 printLog 方法时的 request 和 response 重新构造,直接从 asyncContext 中获取,注意,这点是【关键】。 在 printLog 方法中,方法执行完成后,调用 asyncContext.complete() 方法通知异步上下文请求处理完毕。

    1.6K20

    Tomcat对异步Servlet的支持

    调用startAsync或者异步上下文 final AsyncContext ctx = req.startAsync(); //用线程池来执行耗时操作 Web应用程序需要调用Request对象的startAsync方法来拿到一个异步上下文AsyncContext。这个上下文保存了请求和响应对象。 Web应用需要开启一个新线程处理耗时操作:处理完成后调用AsyncContext#complete,通知Tomcat,请求已经处理完。 异步Servlet原理 Tomcat在这个过程的关键: startAsync方法 创建一个异步上下文AsyncContext对象,保存请求的中间信息,比如Request和Response对象等上下文信息 除了创建AsyncContext对象,startAsync还需要完成一个关键任务,那就是告诉Tomcat当前的Servlet处理方法返回时,不要把响应发到浏览器,因为这个时候,响应还没生成呢;并且不能把

    10220

    Spring Webflux - 01 MVC的困境

    asyncContext = req.startAsync(); AsyncRequestWrapper wrapper = AsyncRequestWrapper.builder( ).asyncContext(asyncContext) .servletRequest(req) .servletResponse(resp asyncContext; private ServletRequest servletRequest; private ServletResponse servletResponse ; private Thread thread; @Override public void run() { processFuture(asyncContext , servletRequest, servletResponse); } private void processFuture(AsyncContext asyncContext,

    10320

    java后台开发- NOTE

    2015-1-6: IDEA servlet-api.jar    idea从14升级到15后,发现 import javax.servlet.AsyncContext;找不到,右击工程,open module CorsFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> 其中async-supported不是必须的,如果你用到了AsyncContext

    37090

    Spring Boot 异步请求和异步调用,一文搞定!

    = GET) public void servletReq (HttpServletRequest request, HttpServletResponse response) { AsyncContext asyncContext = request.startAsync(); //设置监听器:可设置其开始、完成、异常、超时等事件的回调处理 asyncContext.addListener (20000); asyncContext.start(new Runnable() { @Override public void run() { ().setCharacterEncoding("utf-8"); asyncContext.getResponse().setContentType("text/html ;charset=UTF-8"); asyncContext.getResponse().getWriter().println("这是异步的请求返回");

    69330

    用了这么久配置中心,还不知道长轮询是什么?

    SpringMVC 实现了 DeferredResult 和 Servlet3.0 提供的 AsyncContext 其实没有多大区别,我并没有深入研究过两个实现背后的源码,但从使用层面上来看,AsyncContext 所以下文的示例中,我选择了 AsyncContextasyncContext; // 超时标记 private boolean timeout; public AsyncTask(AsyncContext asyncContext, boolean timeout) { this.asyncContext = asyncContext; this.timeout asyncContext = request.startAsync(request, response); AsyncTask asyncTask = new AsyncTask(asyncContext

    1.1K30

    扫码关注腾讯云开发者

    领取腾讯云代金券