Servlet 3.0 AsyncContext 在超时时返回响应

Posted

技术标签:

【中文标题】Servlet 3.0 AsyncContext 在超时时返回响应【英文标题】:Servlet 3.0 AsyncContext returns response at timeout 【发布时间】:2012-08-21 10:12:27 【问题描述】:

我按照this 教程实现了一个简单的聊天应用程序。 我正在最新的 Mozilla Firefox 和 Google Chrome 浏览器中对其进行测试。

我主要担心的是消息交换似乎不是实时发生的。即使所有服务器处理发生在请求后不到一秒的时间内,浏览器也会在超过 AsyncContext 超时后立即获得响应。

即使是默认的10秒或通过AsyncContext.setTimeout()添加的自定义值,响应时间与超时时间相同。这应该是预期的行为吗?有没有办法强制服务器一准备好就发送响应,而不是等待空洞超时间隔?

【问题讨论】:

你是否在本地主机上运行? @FaddishWorm 应用程序正在本地主机上的 Tomcat7 上运行。 那篇文章中有几个 cmets 说可能存在线程问题。下次我在我的 tomcat 服务器附近时会检查一下。 【参考方案1】:

您可能忘记了complete 异步上下文。 Java 6 文档:http://docs.oracle.com/javaee/6/api/javax/servlet/AsyncContext.html#complete()

watcherExecutor.execute(new Runnable()
                        public void run() 
                           // publish a new bid event to a watcher
                           aCtx.getResponse().getWriter().print("A new bid on the item was placed. The current price ..., next bid price is ...");
                           aCtx.complete();
                        ;
                     );

【讨论】:

以上是关于Servlet 3.0 AsyncContext 在超时时返回响应的主要内容,如果未能解决你的问题,请参考以下文章

Servlet-3 Async Context,如何进行异步写入?

AsyncContext的startAsync()方法开启异步

java.lang.SecurityException: class "javax.servlet.AsyncContext"'s signer information d

AsyncContext简介

Servlet3.0中的异步请求

XML配置Servlet Servlet是3.0版本以下的版本