Java 长轮询时10秒后出现Tomcat 7服务器错误

Java 长轮询时10秒后出现Tomcat 7服务器错误,java,spring-mvc,tomcat7,long-polling,internal-server-error,Java,Spring Mvc,Tomcat7,Long Polling,Internal Server Error,我试图在JavaWeb应用程序中实现长轮询。该应用程序是使用SpringMVC3.2编写的,我使用了DeferredResult对象(它代表Servlet3.0异步响应能力) 问题是,使用DeferredResult时,每次发送请求10秒后,我都会收到内部服务器错误(代码500)。预期结果是30秒后的文本数据。我的应用程序日志中没有任何内容,Tomcat日志中也没有任何内容,但在FireFox网络监视器中,我看到了这个错误 另一方面,当我发送同步请求并在服务器中保持30秒时,它会成功完成 有人能

我试图在JavaWeb应用程序中实现长轮询。该应用程序是使用SpringMVC3.2编写的,我使用了DeferredResult对象(它代表Servlet3.0异步响应能力)

问题是,使用DeferredResult时,每次发送请求10秒后,我都会收到内部服务器错误(代码500)。预期结果是30秒后的文本数据。我的应用程序日志中没有任何内容,Tomcat日志中也没有任何内容,但在FireFox网络监视器中,我看到了这个错误

另一方面,当我发送同步请求并在服务器中保持30秒时,它会成功完成

有人能帮我吗

本文末尾有一个测试应用程序下载链接。这是一个maven应用程序

以下是我的应用程序代码:

ResponseController.java

@Controller
@RequestMapping("responses")
public class ResponseController {

    @Autowired
    private ResponseService messagesService;

    @RequestMapping(value="/async", method=RequestMethod.GET)
    @ResponseBody
    public DeferredResult<String> getAsyncUpdate() {
        return messagesService.getAsyncUpdate();
    }

    @RequestMapping(value="/sync", method=RequestMethod.GET)
    @ResponseBody
    public String getSyncUpdate() {
        return messagesService.getSyncUpdate();
    }

}
JQuery请求同步响应

$.ajax({
    url : "responses/async",
    type : "GET",
    timeout : 60000,
    dataType : "json",
    success : function(){
        alert('SUCCESS');
    },
    error : function(){
        alert('FAILURE');
    }
});
$.ajax({
    url : "responses/sync",
    type : "GET",
    timeout : 60000,
    dataType : "json",
    success : function(){
        alert('SUCCESS');
    },
    error : function(){
        alert('FAILURE');
    }
});
web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns="http://java.sun.com/xml/ns/javaee"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
    version="3.0">

    <display-name>test-app</display-name>

    <servlet>
        <servlet-name>mvc-dispatcher</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <async-supported>true</async-supported>
    </servlet>

    <servlet-mapping>
        <servlet-name>mvc-dispatcher</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>

    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>/WEB-INF/mvc-dispatcher-servlet.xml</param-value>
    </context-param>

    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>

</web-app>

测试应用程序
mvc调度器
org.springframework.web.servlet.DispatcherServlet

更新1


以下是一个响应数据:

响应标题:

连接:“关闭”

内容长度:“0”

日期:“2014年10月27日星期一19:48:10 GMT”

服务器:“ApacheCoote/1.1”

更新2


这是我的应用程序日志。我已将日志记录级别配置为所有。不幸的是,它们根本没有错误。(我对tomcat日志做了同样的处理,得到了相同的结果):

2014-11-01 15:33:09调试请求映射HandlerMapping:220-查找路径/响应/异步的处理程序方法
2014-11-01 15:33:09跟踪请求映射HandlerMapping:264-为[/responses/async]:[{[/responses/async],methods=[GET],params=[],Header=[],consumes=[],Products=[],custom=[])找到1个匹配的映射
2014-11-01 15:33:09调试RequestMappingHandlerMapping:227-返回处理程序方法[public org.springframework.web.context.request.async.DeferredResult pl.prv.mra.test.app.controllers.ResponseController.getAsyncUpdate()]
2014-11-01 15:33:09调试DefaultListableBeanFactory:246-返回单例bean“responseController”的缓存实例
2014-11-01 15:33:09跟踪DispatcherServlet:1122-测试处理程序适配器[org.springframework.web.servlet.mvc.method.annotation]。RequestMappingHandlerAdapter@7e036b3]
2014-11-01 15:33:09调试调度器Servlet:912-上次修改的[/test app/responses/async]值为:-1
2014-11-01 15:33:09跟踪HandlerMethod:129-使用参数[]调用[getAsyncUpdate]方法
2014-11-01 15:33:09跟踪句柄方法:135-方法[getAsyncUpdate]返回[org.springframework.web.context.request.async]。DeferredResult@4810881c]
2014-11-01 15:33:09 TRACE HandlerMethodReturnValueHandlerComposite:78-测试返回值处理程序[org.springframework.web.servlet.mvc.method.annotation]。ModelAndViewMethodReturnValueHandler@2a426218]支持[org.springframework.web.context.request.async.DeferredResult]
2014-11-01 15:33:09 TRACE HandlerMethodReturnValueHandlerComposite:78-测试返回值处理程序[org.springframework.web.method.annotation]。ModelMethodProcessor@6c362b54]支持[org.springframework.web.context.request.async.DeferredResult]
2014-11-01 15:33:09 TRACE HandlerMethodReturnValueHandlerComposite:78-测试返回值处理程序[org.springframework.web.servlet.mvc.method.annotation]。ViewMethodReturnValueHandler@5856cf4c]支持[org.springframework.web.context.request.async.DeferredResult]
2014-11-01 15:33:09 TRACE HandlerMethodReturnValueHandlerComposite:78-测试返回值处理程序[org.springframework.web.servlet.mvc.method.annotation]。HttpEntityMethodProcessor@2b43b3e3]支持[org.springframework.web.context.request.async.DeferredResult]
2014-11-01 15:33:09 TRACE HandlerMethodReturnValueHandlerComposite:78-测试返回值处理程序[org.springframework.web.servlet.mvc.method.annotation]。CallableMethodReturnValueHandler@deae877]支持[org.springframework.web.context.request.async.DeferredResult]
2014-11-01 15:33:09 TRACE HandlerMethodReturnValueHandlerComposite:78-测试返回值处理程序[org.springframework.web.servlet.mvc.method.annotation]。DeferredResultMethodReturnValueHandler@3943e3c4]支持[org.springframework.web.context.request.async.DeferredResult]
2014-11-01 15:33:10调试WebAsyncManager:429-启动GET的并发处理[/test app/responses/async]
2014-11-01 15:33:10跟踪DispatcherServlet:1028-已清除线程绑定请求上下文:org.apache.catalina.connector。RequestFacade@655d2842
2014-11-01 15:33:10调试调度员Servlet:963-将响应保留为打开状态以进行并行处理
2014-11-01 15:33:10跟踪XmlWebApplicationContext:332-在WebApplicationContext中为命名空间“mvc dispatcher servlet”发布事件:ServletRequestHandleEvent:url=[/test-app/responses/async];客户=[127.0.0.1];方法=[GET];servlet=[mvc调度程序];会话=[55143812B6586F66C0001D3F41B1947C];用户=[null];时间=[13ms];状态=[确定]
2014-11-01 15:33:10跟踪XmlWebApplicationContext:332-根WebApplicationContext中的发布事件:ServletRequestHandleEvent:url=[/test-app/responses/async];客户=[127.0.0.1];方法=[GET];servlet=[mvc调度程序];会话=[55143812B6586F66C0001D3F41B1947C];用户=[null];时间=[13ms];状态=[确定]

好的。我找到了解决办法

在Tomcat配置中(在server.xml文件中),有一个HTTP/1.1连接器。我认为connectionTimeout参数定义了每个连接的超时,但它没有

对于异步连接(就像在我的例子中),有单独的参数调用。它的默认值是10秒

设置如下:

<Connector port="8080" protocol="HTTP/1.1" asyncTimeout="60000" connectionTimeout="20000" redirectPort="8443" />


解决了我的问题。

我也遇到了同样的问题,异步超时时间不够。。。 我使用Zuul反向代理我的api,但我忘记添加Zuul.host.connect-timeout-millis和Zuul.host.socket-timeout-millis,您的解决方案+此解决方案解决了我的问题。

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns="http://java.sun.com/xml/ns/javaee"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
    version="3.0">

    <display-name>test-app</display-name>

    <servlet>
        <servlet-name>mvc-dispatcher</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <async-supported>true</async-supported>
    </servlet>

    <servlet-mapping>
        <servlet-name>mvc-dispatcher</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>

    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>/WEB-INF/mvc-dispatcher-servlet.xml</param-value>
    </context-param>

    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>

</web-app>
<?xml version='1.0' encoding='utf-8'?>
<Server port="8005" shutdown="SHUTDOWN">
    <Listener className="org.apache.catalina.core.AprLifecycleListener"
        SSLEngine="on" />
    <Listener className="org.apache.catalina.core.JasperListener" />
    <Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" />
    <Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" />
    <Listener className="org.apache.catalina.core.ThreadLocalLeakPreventionListener" />

    <GlobalNamingResources>
        <Resource name="UserDatabase" auth="Container"
            type="org.apache.catalina.UserDatabase" description="User database that can be updated and saved"
            factory="org.apache.catalina.users.MemoryUserDatabaseFactory"
            pathname="conf/tomcat-users.xml" />
    </GlobalNamingResources>

    <Service name="Catalina">

        <Connector port="8080" protocol="HTTP/1.1"
            connectionTimeout="20000" redirectPort="8443" />

        <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />

        <Engine name="Catalina" defaultHost="localhost">

            <Realm className="org.apache.catalina.realm.LockOutRealm">
                <Realm className="org.apache.catalina.realm.UserDatabaseRealm"
                    resourceName="UserDatabase" />
            </Realm>

            <Host name="localhost" appBase="webapps" unpackWARs="true"
                autoDeploy="true">

                <Valve className="org.apache.catalina.valves.AccessLogValve"
                    directory="logs" prefix="localhost_access_log." suffix=".txt"
                    pattern="%h %l %u %t &quot;%r&quot; %s %b" />

            </Host>
        </Engine>
    </Service>
</Server>
2014-11-01 15:33:09 DEBUG RequestMappingHandlerMapping:220 - Looking up handler method for path /responses/async
2014-11-01 15:33:09 TRACE RequestMappingHandlerMapping:264 - Found 1 matching mapping(s) for [/responses/async] : [{[/responses/async],methods=[GET],params=[],headers=[],consumes=[],produces=[],custom=[]}]
2014-11-01 15:33:09 DEBUG RequestMappingHandlerMapping:227 - Returning handler method [public org.springframework.web.context.request.async.DeferredResult<java.lang.String> pl.prv.mra.test.app.controllers.ResponseController.getAsyncUpdate()]
2014-11-01 15:33:09 DEBUG DefaultListableBeanFactory:246 - Returning cached instance of singleton bean 'responseController'
2014-11-01 15:33:09 TRACE DispatcherServlet:1122 - Testing handler adapter [org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter@7e036b3]
2014-11-01 15:33:09 DEBUG DispatcherServlet:912 - Last-Modified value for [/test-app/responses/async] is: -1
2014-11-01 15:33:09 TRACE HandlerMethod:129 - Invoking [getAsyncUpdate] method with arguments []
2014-11-01 15:33:09 TRACE HandlerMethod:135 - Method [getAsyncUpdate] returned [org.springframework.web.context.request.async.DeferredResult@4810881c]
2014-11-01 15:33:09 TRACE HandlerMethodReturnValueHandlerComposite:78 - Testing if return value handler [org.springframework.web.servlet.mvc.method.annotation.ModelAndViewMethodReturnValueHandler@2a426218] supports [org.springframework.web.context.request.async.DeferredResult<java.lang.String>]
2014-11-01 15:33:09 TRACE HandlerMethodReturnValueHandlerComposite:78 - Testing if return value handler [org.springframework.web.method.annotation.ModelMethodProcessor@6c362b54] supports [org.springframework.web.context.request.async.DeferredResult<java.lang.String>]
2014-11-01 15:33:09 TRACE HandlerMethodReturnValueHandlerComposite:78 - Testing if return value handler [org.springframework.web.servlet.mvc.method.annotation.ViewMethodReturnValueHandler@5856cf4c] supports [org.springframework.web.context.request.async.DeferredResult<java.lang.String>]
2014-11-01 15:33:09 TRACE HandlerMethodReturnValueHandlerComposite:78 - Testing if return value handler [org.springframework.web.servlet.mvc.method.annotation.HttpEntityMethodProcessor@2b43b3e3] supports [org.springframework.web.context.request.async.DeferredResult<java.lang.String>]
2014-11-01 15:33:09 TRACE HandlerMethodReturnValueHandlerComposite:78 - Testing if return value handler [org.springframework.web.servlet.mvc.method.annotation.CallableMethodReturnValueHandler@deae877] supports [org.springframework.web.context.request.async.DeferredResult<java.lang.String>]
2014-11-01 15:33:09 TRACE HandlerMethodReturnValueHandlerComposite:78 - Testing if return value handler [org.springframework.web.servlet.mvc.method.annotation.DeferredResultMethodReturnValueHandler@3943e3c4] supports [org.springframework.web.context.request.async.DeferredResult<java.lang.String>]
2014-11-01 15:33:10 DEBUG WebAsyncManager:429 - Concurrent handling starting for GET [/test-app/responses/async]
2014-11-01 15:33:10 TRACE DispatcherServlet:1028 - Cleared thread-bound request context: org.apache.catalina.connector.RequestFacade@655d2842
2014-11-01 15:33:10 DEBUG DispatcherServlet:963 - Leaving response open for concurrent processing
2014-11-01 15:33:10 TRACE XmlWebApplicationContext:332 - Publishing event in WebApplicationContext for namespace 'mvc-dispatcher-servlet': ServletRequestHandledEvent: url=[/test-app/responses/async]; client=[127.0.0.1]; method=[GET]; servlet=[mvc-dispatcher]; session=[55143812B6586F66C0001D3F41B1947C]; user=[null]; time=[13ms]; status=[OK]
2014-11-01 15:33:10 TRACE XmlWebApplicationContext:332 - Publishing event in Root WebApplicationContext: ServletRequestHandledEvent: url=[/test-app/responses/async]; client=[127.0.0.1]; method=[GET]; servlet=[mvc-dispatcher]; session=[55143812B6586F66C0001D3F41B1947C]; user=[null]; time=[13ms]; status=[OK]
<Connector port="8080" protocol="HTTP/1.1" asyncTimeout="60000" connectionTimeout="20000" redirectPort="8443" />