我试图使用Servlet API 3中定义的异步处理来实现COMET聊天。该聊天无法正常工作-聊天被阻止,因此我创建了调试Servlet来仅测试异步部分。
这是我的doGet方法:
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
log.debug("doGet called");
int timeout = 30 + RandomUtils.nextInt(60);
String message = RandomStringUtils.randomAlphanumeric(50 + RandomUtils.nextInt(250));
response.setHeader("Access-Control-Allow-Origin", "*");
final AsyncContext context = request.startAsync();
synchronized(items) {
items.add(new RequestItem(context, message, timeout));
}
log.debug("doGet created request and finished");
}
我将请求项放入队列中,并且正在运行一个线程,该线程将在指定的超时后接收这些项,并将响应发送到AsyncContext,并打印有关该消息的消息。问题是,线程被阻塞,直到AsyncContext得到响应为止。这是在浏览器中请求4个页面加载后在我的日志中可见的内容:
2011-12-08 13:56:36,923 DEBUG [my.servlet.TestAsyncServlet] doGet called
2011-12-08 13:56:36,952 DEBUG [my.servlet.TestAsyncServlet] doGet created request and finished
2011-12-08 13:57:39,934 TRACE [my.servlet.TestAsyncServlet] respond on item RequestItem [context=org.apache.catalina.core.AsyncContextImpl@175870a, message=zEQpATavzwFl6qIbBKve4OzIY9UUuZBwbqN1TC5KpU3i8LM9B6ChgUqaRmcT2yF, timeout=0]
2011-12-08 13:57:39,962 DEBUG [my.servlet.TestAsyncServlet] doGet called
2011-12-08 13:57:39,962 DEBUG [my.servlet.TestAsyncServlet] doGet created request and finished
2011-12-08 13:58:53,949 TRACE [my.servlet.TestAsyncServlet] respond on item RequestItem [context=org.apache.catalina.core.AsyncContextImpl@88ee03, message=pKHKC632CPIk7hGLV0YqCbQl1qpWIoyNv5OWCp21bEqoni1gbY79HT61QEUS2eCjeTMoNEwdqKzCZNGgDngULysSzVdzFTnQQ5cQ8JvcYnp1pLVqGTueJPWnbRdUuO, timeout=0]
2011-12-08 13:58:53,960 DEBUG [my.servlet.TestAsyncServlet] doGet called
2011-12-08 13:58:53,960 DEBUG [my.servlet.TestAsyncServlet] doGet created request and finished
2011-12-08 13:59:36,954 TRACE [my.servlet.TestAsyncServlet] respond on item RequestItem [context=org.apache.catalina.core.AsyncContextImpl@197950e, message=43FPeEUZWBLqgkAqS3WOFMiHUMVvx6o4jNqWLx8kUvwxqJqpOZyGCtiIcr7yw, timeout=0]
2011-12-08 13:59:36,999 DEBUG [my.servlet.TestAsyncServlet] doGet called
2011-12-08 13:59:36,999 DEBUG [my.servlet.TestAsyncServlet] doGet created request and finished
2011-12-08 14:00:34,957 TRACE [my.servlet.TestAsyncServlet] respond on item RequestItem [context=org.apache.catalina.core.AsyncContextImpl@1cb1278, message=r69Y4NQsyR1vj0kzUlHssic2x1Yrr6T09IGKjWAH1E6Lz4VhFTy9dQHi5CPeTObyjLLBDlCLEDfiyMUnVkVIEgYG7r47Ak4w30RklhzdEi9nthqdfNkry6nyjircsFPX534NqWjI1LwsrGq5nOa3ZYtfjfPVpGlk4KDmWP11L53YntO3GmptZPKa50gcqj9i, timeout=0]
可以看到,只有在回答了先前的请求(理论上是异步的)之后,才调用下一个doGet方法。因此,整个异步操作根本不起作用!这是web.xml声明:
<servlet>
<servlet-name>TestAsyncServlet</servlet-name>
<servlet-class>my.servlet.TestAsyncServlet</servlet-class>
<async-supported>true</async-supported>
</servlet>
<servlet-mapping>
<servlet-name>TestAsyncServlet</servlet-name>
<url-pattern>/test-async</url-pattern>
</servlet-mapping>
我正在尽一切可能在Internet中找到它。我看不出要犯错误的地方。我发现在servlet.xml中没有什么特别的配置。所以问题是,为什么它不能正常工作?
好的,作为研究的一部分,我编写了测试程序,该程序打开了与tomcat的多重连接,并在异步servlet上进行了GET /
POST。我已经调试并重新检查了server.xml配置,有限的线程池以更好地查看测试结果等。现在,我的连接器配置如下所示:
<Connector port="8080" protocol="org.apache.coyote.http11.Http11NioProtocol"
minProcessors="3"
maxProcessors="8"
maxThreads="20"
connectionTimeout="150000"
asyncTimeout="150000" />
这正在工作!我已经使用NIO进行了测试,一次完成了1000个连接,并且一次都处理了所有连接。
但是,我描述的效果仍然存在于浏览器中。当我尝试在10个选项卡上加载servlet时,第一次加载而不是第二个加载。等等。这似乎是浏览器的行为,服务器上没有任何阻塞。当我打开3个浏览器(Firefox,Chrome,Opera)时,我一次处理了3个连接。
因此,Servlet API 3.0中定义的异步处理可在Tomcat
7上运行,但是,必须使用自己的程序进行测试,而不能在浏览器中使用多个选项卡…在多个选项卡中测试COMET聊天也无法按预期进行。但是,在实际示例中,一台计算机将仅打开一个连接。而且,浏览器的行为也不是任何服务器的错误。
编辑 后的Spring
MVC溶液纳入Web应用程序,异步处理模式被停止(从web.xml中参数被忽略)。但是,可以通过添加以下行来手动设置异步支持:
request.setAttribute("org.apache.catalina.ASYNC_SUPPORTED", true);
类项目: hbm文件: 方法如下:
Spring MVC 3.2开始引入了基于Servlet 3的异步请求处理。相比以前,控制器方法已经不一定需要返回一个值,而是可以返回一个java.util.concurrent.Callable的对象,并通过Spring MVC所管理的线程来产生返回值。与此同时,Servlet容器的主线程则可以退出并释放其资源了,同时也允许容器去处理其他的请求。通过一个TaskExecutor,Spring M
在更新到Android Studio3.2 Beta 1后,我开始在两个不同的项目中出现以下错误: Android Studio 3.1.3没有错误,在更新到beta 1之前,Android Studio 3.2的各种金丝雀版本也没有错误。 这不是Android Studio Gradle已经释放的模块的副本 编辑 事件日志显示
异常严重:Servlet。路径为[z2]的上下文中servlet[dispatcher]的service()引发异常[请求处理失败;嵌套异常为org.springframework.dao.DataIntegrityViolationException:not null属性引用null或瞬时值:com.spring.entity.Product.cd;嵌套异常为org.hibernate.Prop
本文向大家介绍如果将axios异步请求同步化处理?相关面试题,主要包含被问及如果将axios异步请求同步化处理?时的应答技巧和注意事项,需要的朋友参考一下
当我尝试连接到Oracle数据库时,出现了以下问题。 有例外 此reportMapper.xml
我是webflux的新手,无法找到正确的材料来继续实现。 null
在Servlet 3.0中,引入了异步处理的概念。所以所有的书都说这消除了每个请求一个线程的要求。我已经测试过了,是的,它确实有效。现在,我有一个简单的servlet,用户在其中以同步模式启动HTTP请求。线程只需Hibernate1秒,然后回复客户端。当我对这种模式进行负载测试时,服务器每秒只能处理4个请求。现在,我将同步模式更改为异步模式,并根据请求创建一个新线程,将原始http线程释放回池。