`
sunqi
  • 浏览: 230863 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

tomcat7 servlet 3异步请求AsyncContext AsyncListener超时问题

    博客分类:
  • java
 
阅读更多

最近在用tomcat来搞servlet异步化请求,当然异步化下异常处理也很重要,servlet3默认带一个监听器,可以监听onComplete,onError,onStartAsync,onTimeout事件,当然onTimeout可以选择在系统server.xml当中Connector 设置asyncTimeout="100"单位是毫秒,如果不设置,默认就是10秒,当然

AsyncContext asyncContext = request.startAsync();
asyncContext.setTimeout(100);

 在代码中也可以去设置,tomcat会以此为准,当然你必须得addListener,

 

 

可调试中发现这100毫秒怎么也不会生效,当服务端返回超过100ms,可以请求就是不会报超时,这是为什么呢?看tomcat源码了

找啊找啊找,一切都明了了,原来超时线程在那sleep(1000)呢,因此要得到很短的超时并且能够生效,要么自己搞,要么改tomcat的源码吧

 

 bio && apr

实现

 /**
     * Async timeout thread
     */
    protected class AsyncTimeout implements Runnable {
        /**
         * The background thread that checks async requests and fires the
         * timeout if there has been no activity.
         */
        @Override
        public void run() {

            // Loop until we receive a shutdown command
            while (running) {
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    // Ignore
                }
                long now = System.currentTimeMillis();
                Iterator<SocketWrapper<Socket>> sockets =
                    waitingRequests.iterator();
                while (sockets.hasNext()) {
                    SocketWrapper<Socket> socket = sockets.next();
                    long access = socket.getLastAccess();
                    if (socket.getTimeout() > 0 &&
                            (now-access)>socket.getTimeout()) {
                        processSocketAsync(socket,SocketStatus.TIMEOUT);
                    }
                }

                // Loop if endpoint is paused
                while (paused && running) {
                    try {
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                        // Ignore
                    }
                }

            }
        }
    }

 

 nio实现

 
  Poller线程当中,存在
             //process timeouts
                    timeout(keyCount,hasEvents);
因此也是在有新的事件到来,或者selectorTimeout=1000ms超时后,都会去触发





                          // Async requests with a timeout of 0 or less never timeout
                            long delta = now - ka.getLastAccess();
                            long timeout = (ka.getTimeout()==-1)?((long) socketProperties.getSoTimeout()):(ka.getTimeout());
                            boolean isTimedout = delta > timeout;
                            if (isTimedout) {
                                // Prevent subsequent timeouts if the timeout event takes a while to process
                                ka.access(Long.MAX_VALUE);
                                processSocket(ka.getChannel(), SocketStatus.TIMEOUT, true);
                            }
 

 

 

 

 

 

分享到:
评论

相关推荐

    servlet3异步请求

    要开始使用Servlet3的异步请求,首先你需要一个支持Servlet 3.0及以上版本的容器,如Tomcat 7+、Jetty 9+等。然后,你需要在`web.xml`配置文件或者通过Java注解声明一个支持异步的Servlet。使用`@AsyncSupported`...

    servlet是如何同时处理多个请求的

    7. **异步Servlet**: - 自Servlet 3.0版本开始,Servlet支持异步处理请求。通过`AsyncContext`接口,Servlet可以在完成部分工作后返回,稍后再继续处理,从而提高服务器的吞吐量。 8. **线程局部存储**: - 如果...

    Java Servlet3.0异步处理问题

    Servlet 3.0 开始提供了 AsyncContext 用来支持异步处理请求,那么异步处理请求到底能够带来哪些好处? 在传统的 Web 容器中,处理请求的方式是为每个 request 分配一个 thread。这意味着 thread 的创建不是没有...

    依赖瓶颈与HTTP请求异步处理.doc

    Servlet 3规范引入的异步服务处理(Async Servlet)为解决上述问题提供了新思路。Async Servlet允许在请求处理过程中返回控制权给容器,直到准备好响应时再通知容器发送,这样可以在不阻塞线程的情况下处理请求。这...

    tomcat7最新版本

    4. **Servlet3.0规范**:Tomcat7实现了Servlet3.0,允许在web.xml之外进行动态注册Servlet和Filter,以及异步处理能力。 5. **更好的安全管理**:提供更精细的角色管理和访问控制,增强了应用的安全性。 6. **WebDAV...

    Servlet请求响应的特殊处理.rar

    - Servlet容器(如Tomcat)为每个请求创建一个单独的线程,因此Servlet实例可能是多线程环境下的。开发者需注意线程安全问题,避免在Servlet中使用非线程安全的数据结构或方法。 4. **安全性**: - 认证与授权:...

    javaweb异步处理程序

    在此期间,服务器可以释放线程去处理其他请求,而Servlet可以在稍后某个时间点完成异步操作,通过`AsyncContext`对象的`complete()`方法结束异步处理并发送响应。 在实际应用中,JavaWeb异步处理常用于处理耗时的...

    comet4j+tomcat6+tomcat7并附完整版Demo

    3. **配置文件**:如Tomcat的server.xml或web.xml,可能需要进行相应的配置以支持Comet4j的运行,例如设置连接超时时间、开启特定的 Comet4j 相关监听器等。 4. **部署说明**:如何将这些代码部署到Tomcat 6或7上,...

    comet4j-tomcat7后台信息推送jar包

    Tomcat7是Apache软件基金会的Apache Tomcat服务器的一个版本,它是一个开源的、实现了Java Servlet和JavaServer Pages(JSP)规范的应用服务器。Tomcat7因其轻量级、高效和易于管理的特性,在小型到中型企业级应用中...

    comet4j所需js与jar包(tomcat6与tomcat7)

    3. **Tomcat兼容性**:由于提供了针对Tomcat 6和Tomcat 7的版本,Comet4J需要与特定版本的Tomcat容器配合使用。这涉及到对Tomcat的Servlet API和生命周期的理解,以及配置文件的调整。 4. **配置与集成**:在Web...

    Tomcat面试题 14道.pdf

    aio 是 JDK 7 开始支持的异步非阻塞 IO。apr 是 Tomcat 将以 JNI 的形式调用 Apache HTTP 服务器的核心动态链接库来处理文件读取或网络传输操作。 三、Connector 配置 Connector 配置文件中有多个参数可以进行配置...

    apache- TomCat-7

    1. **Servlet 3.0支持**:Tomcat 7引入了Servlet 3.0规范,允许开发者进行异步处理,提高性能,同时提供了注解支持,简化了Web应用程序的部署。 2. **JSP 2.2支持**:此版本支持JSP 2.2规范,带来了更强大的EL...

    达内 tts java_servlet课件 pdf 高清晰

    9. **Servlet异步处理** - Servlet 3.0引入了异步处理能力,允许Servlet在处理请求时不阻塞线程,提高服务器并发性能。 10. **Web应用部署** - 创建WAR文件(Web Application Archive)打包Web应用,便于在各种...

    tomcat7集群redis实现session共享jar包

    Tomcat7是一个流行的Java Servlet容器,而Redis则是一个高性能的键值存储系统,常用于缓存和数据持久化。当我们在部署Tomcat7集群时,为了确保用户的Session能够在不同服务器之间无缝切换,我们可以利用Redis来实现...

    Java Servlet API (英文版)

    - **Servlet容器**:运行Servlet的环境,如Tomcat、Jetty等,负责管理Servlet的生命周期,加载、初始化、服务、销毁Servlet实例。 2. **Servlet生命周期** - **加载与实例化**: 当服务器启动或首次接收到对...

    tomcat 7.0

    1. **Servlet 3.0支持**:Tomcat 7支持Servlet 3.0规范,这带来了许多新特性,如异步处理能力、生命周期回调方法、注解配置等。开发者可以通过注解直接在类或方法级别定义Servlet,无需XML配置。 2. **JSP 2.2支持*...

    apache-tomcat-7.0.42

    1. **Servlet 3.0支持**:Tomcat 7.0.42 支持Servlet 3.0规范,带来了许多新特性,如异步处理能力,这允许开发者在不阻塞请求线程的情况下处理请求,从而提高服务器性能。另外,还支持动态注册Servlet和过滤器,以及...

    使用httpclient访问servlet

    通常,Servlet部署在Web服务器或应用服务器上,如Tomcat、Jetty等。当我们有一个服务器A,需要调用另一个服务器B上的Servlet服务时,HttpClient便成为了一个理想的解决方案。 1. **HttpClient介绍**: Apache ...

    servlet2.5源码

    - Servlet容器(如Tomcat)负责加载Servlet,管理Servlet生命周期,包括实例化、初始化、服务、销毁等阶段。 - 在Servlet 2.5中,通过web.xml文件配置Servlet,定义Servlet的映射、初始化参数、会话超时等。 3. *...

Global site tag (gtag.js) - Google Analytics