5

在我的应用程序中,我有一个自主开发的框架,它将所有请求映射到一个中央 ControllerServlet(没什么花哨的,它具有几乎所有框架的基本功能)。我必须实现发布者-订阅者消息交换功能,我决定使用 Servlet 3.0 的异步方法。

当前ControllerServletAuthenticationFilter没有设置为 asyncSupported。我可以为所有异步处理实现第二个 CotrollerServlet,也可以将现有的 ControllerServlet 声明为asyncSupported=true(即使有些请求不需要异步处理)。

...对于使用异步功能的应用程序,整个请求处理链必须通过注释或其部署描述符设置此属性... - 源

从这里我知道我必须将其声明AuthenticationFilterasyncSupported=true(并且在某些情况下不需要异步)。

声明 servlet 和过滤器是否有任何缺点,asyncSupported=true即使它们也映射不需要异步处理的请求?会不会有任何可扩展性问题?

4

1 回答 1

1

Java Servlet 3.0 规范2.3.3.3 异步处理章节包含一个提示:

从同步 servlet 分派到异步 servlet 是非法的。但是,引发 IllegalStateException 的决定与应用程序调用 startAsync 时有所不同。这将允许 servlet 充当同步或异步 servlet。

它没有直接说明,但是这句话让我相信,就 JLS 作者而言,一个 servlet 的这种双重同步/异步性质并不是什么不寻常的事情。

另一方面,请查阅容器的文档/源代码。仅仅因为从 JLS 的角度来看它是合法的,并不意味着您的容器没有进行一些巧妙的优化,如果AsyncContext没有真正使用这些优化会对性能产生负面影响。否则,如果所有 servlet 都可以简单地在任何一种模式下工作,那么这个属性的目的是什么,除了记录?

于 2012-08-19T16:34:19.793 回答