最近在用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的异步请求,首先你需要一个支持Servlet 3.0及以上版本的容器,如Tomcat 7+、Jetty 9+等。然后,你需要在`web.xml`配置文件或者通过Java注解声明一个支持异步的Servlet。使用`@AsyncSupported`...
7. **异步Servlet**: - 自Servlet 3.0版本开始,Servlet支持异步处理请求。通过`AsyncContext`接口,Servlet可以在完成部分工作后返回,稍后再继续处理,从而提高服务器的吞吐量。 8. **线程局部存储**: - 如果...
Servlet 3.0 开始提供了 AsyncContext 用来支持异步处理请求,那么异步处理请求到底能够带来哪些好处? 在传统的 Web 容器中,处理请求的方式是为每个 request 分配一个 thread。这意味着 thread 的创建不是没有...
Servlet 3规范引入的异步服务处理(Async Servlet)为解决上述问题提供了新思路。Async Servlet允许在请求处理过程中返回控制权给容器,直到准备好响应时再通知容器发送,这样可以在不阻塞线程的情况下处理请求。这...
4. **Servlet3.0规范**:Tomcat7实现了Servlet3.0,允许在web.xml之外进行动态注册Servlet和Filter,以及异步处理能力。 5. **更好的安全管理**:提供更精细的角色管理和访问控制,增强了应用的安全性。 6. **WebDAV...
- Servlet容器(如Tomcat)为每个请求创建一个单独的线程,因此Servlet实例可能是多线程环境下的。开发者需注意线程安全问题,避免在Servlet中使用非线程安全的数据结构或方法。 4. **安全性**: - 认证与授权:...
在此期间,服务器可以释放线程去处理其他请求,而Servlet可以在稍后某个时间点完成异步操作,通过`AsyncContext`对象的`complete()`方法结束异步处理并发送响应。 在实际应用中,JavaWeb异步处理常用于处理耗时的...
3. **配置文件**:如Tomcat的server.xml或web.xml,可能需要进行相应的配置以支持Comet4j的运行,例如设置连接超时时间、开启特定的 Comet4j 相关监听器等。 4. **部署说明**:如何将这些代码部署到Tomcat 6或7上,...
Tomcat7是Apache软件基金会的Apache Tomcat服务器的一个版本,它是一个开源的、实现了Java Servlet和JavaServer Pages(JSP)规范的应用服务器。Tomcat7因其轻量级、高效和易于管理的特性,在小型到中型企业级应用中...
3. **Tomcat兼容性**:由于提供了针对Tomcat 6和Tomcat 7的版本,Comet4J需要与特定版本的Tomcat容器配合使用。这涉及到对Tomcat的Servlet API和生命周期的理解,以及配置文件的调整。 4. **配置与集成**:在Web...
aio 是 JDK 7 开始支持的异步非阻塞 IO。apr 是 Tomcat 将以 JNI 的形式调用 Apache HTTP 服务器的核心动态链接库来处理文件读取或网络传输操作。 三、Connector 配置 Connector 配置文件中有多个参数可以进行配置...
1. **Servlet 3.0支持**:Tomcat 7引入了Servlet 3.0规范,允许开发者进行异步处理,提高性能,同时提供了注解支持,简化了Web应用程序的部署。 2. **JSP 2.2支持**:此版本支持JSP 2.2规范,带来了更强大的EL...
9. **Servlet异步处理** - Servlet 3.0引入了异步处理能力,允许Servlet在处理请求时不阻塞线程,提高服务器并发性能。 10. **Web应用部署** - 创建WAR文件(Web Application Archive)打包Web应用,便于在各种...
Tomcat7是一个流行的Java Servlet容器,而Redis则是一个高性能的键值存储系统,常用于缓存和数据持久化。当我们在部署Tomcat7集群时,为了确保用户的Session能够在不同服务器之间无缝切换,我们可以利用Redis来实现...
- **Servlet容器**:运行Servlet的环境,如Tomcat、Jetty等,负责管理Servlet的生命周期,加载、初始化、服务、销毁Servlet实例。 2. **Servlet生命周期** - **加载与实例化**: 当服务器启动或首次接收到对...
1. **Servlet 3.0支持**:Tomcat 7支持Servlet 3.0规范,这带来了许多新特性,如异步处理能力、生命周期回调方法、注解配置等。开发者可以通过注解直接在类或方法级别定义Servlet,无需XML配置。 2. **JSP 2.2支持*...
1. **Servlet 3.0支持**:Tomcat 7.0.42 支持Servlet 3.0规范,带来了许多新特性,如异步处理能力,这允许开发者在不阻塞请求线程的情况下处理请求,从而提高服务器性能。另外,还支持动态注册Servlet和过滤器,以及...
通常,Servlet部署在Web服务器或应用服务器上,如Tomcat、Jetty等。当我们有一个服务器A,需要调用另一个服务器B上的Servlet服务时,HttpClient便成为了一个理想的解决方案。 1. **HttpClient介绍**: Apache ...
- Servlet容器(如Tomcat)负责加载Servlet,管理Servlet生命周期,包括实例化、初始化、服务、销毁等阶段。 - 在Servlet 2.5中,通过web.xml文件配置Servlet,定义Servlet的映射、初始化参数、会话超时等。 3. *...