web.xml 中的 async-supported 的目的是什么?

42
<servlet>
        <description>xxx</description>
        <servlet-name>xxx</servlet-name>
        <servlet-class>com.xxx.yyy</servlet-class>
        <async-supported>true</async-supported>
</servlet>

async-supported 在 servlet 的 web.xml 配置文件中的目的是什么?我什么情况下可以使用它?


2
这是为Servlet 3.0添加的功能,请参见:https://blogs.oracle.com/enterprisetechtips/entry/asynchronous_support_in_servlet_3 - Ken Chan
3个回答

51

具有讽刺意味的是,我正在寻找如何在tomcat的web.xml中编写此属性的语法,这是我从谷歌打开的第一个搜索结果 - 它写得很正确(它起作用),所以谢谢。

不过,为了回答你的问题,这允许servlet存储未来响应的传入请求。它释放了用于处理请求的线程,以便它可以在服务器准备好发送响应之前被用于其他地方。

实际上,使用这个配置,您可以设置一个servlet (实际上) 推送 数据到客户端(客户端发送初始请求到服务器后)。

这种技术取代了需要定时请求客户端获取可能在不确定时间间隔内更改的数据的需求。并且通过不挂起线程以可扩展的方式完成这一点。


一些使用案例包括:

聊天应用程序,当一个客户端输入消息时,您希望另一个客户端立即看到它。

电子邮件应用程序,允许客户端在电子邮件服务器接收到邮件后立即查看邮件。

我还将其用于从编程逻辑控制器向浏览器发送输入更改更新以进行自动化任务。

这里是一个很好的教程。这个也涵盖了Java中的一些要点。


这也适用于GlassFish 4.1。 - peter_pilgrim
13
请注意:如果您的异步请求中有任何过滤器映射,则每个过滤器的<filter>部分也需要添加<async-supported>true</async-supported> - TMG

3
主要目的是作为Websockets的备用机制,使XHR流传输能够实现。如果没有明确配置为true,则您的应用程序无法回退到XHR流传输,这将导致java.lang.IllegalArgumentException:异步支持必须在servlet上启用...。
更详细信息请参见此处(Servlet 3 Async请求):
http://docs.spring.io/spring/docs/current/spring-framework-reference/html/websocket.html 为了验证您的配置是否正确应用,请将浏览器中的WebSocket连接数量限制为1,然后在多个选项卡中打开应用程序。如果已应用配置,则在选项卡1中建立WebSocket连接,在选项卡2中进行XHR流传输。

1
如果您正在使用GlassFish 4.1,可以在src/main/webapp/web.xml中尝试以下操作:
<servlet>
    <servlet-name>javax.ws.rs.core.Application</servlet-name>
    <load-on-startup>1</load-on-startup>
    <async-supported>true</async-supported>
</servlet>
<servlet-mapping>
    <servlet-name>javax.ws.rs.core.Application</servlet-name>
    <url-pattern>/rest/*</url-pattern>
</servlet-mapping>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接