在我的application.properties文件中,我有......
server.port=8086
server.connection-timeout=15000
Run Code Online (Sandbox Code Playgroud)
我知道文件正在正确加载,因为服务器在端口8086上运行.
在应用程序中,我有一个 RestController
@RestController
class TestController {
@GetMapping()
fun getValues(): ResponseEntity<*> {
return someLongRunningProcessPossiblyHanging()
}
}
Run Code Online (Sandbox Code Playgroud)
当我调用端点时,请求永远不会超时,它只是无限期挂起.
我错过了什么吗?
注意:我也被告知Tomcat在几分钟内使用此字段,而不是毫秒(相当不寻常的选择IMO).我已经尝试将其设置为server.connection-timeout=1表示1分钟,但这也不起作用.
注意:我不希望另一个 HTTP请求导致先前的请求超时,我希望每个HTTP请求自己超时,如果过多的时间过去服务请求.
我已经在spring boot embeded tomcat server中将keep alive timeout设置为30秒.所以我在Application.java中使用下面的,
@Bean
public EmbeddedServletContainerFactory getEmbeddedServletContainerFactory() {
TomcatEmbeddedServletContainerFactory containerFactory = new TomcatEmbeddedServletContainerFactory();
containerFactory
.addConnectorCustomizers(new TomcatConnectorCustomizer() {
@Override
public void customize(Connector connector) {
((AbstractProtocol) connector.getProtocolHandler())
.setKeepAliveTimeout(30000);
}
});
return containerFactory;
}
Run Code Online (Sandbox Code Playgroud)
然后我从我的休息控制器睡了40秒的请求线程.但是当我通过邮递员发出请求时,它成功返回HTTP状态代码200,而不应该返回网关超时错误.
我尝试setConnectionTimeout和setKeepAliveTimeout,它不起作用.
我在这里失踪了什么?
编辑问题:我最初的问题
让我解释一下我的原始问题,这个问题引导我提出上述问题.
好吧,我有一个很长的民意调查过程,通常运行超过5分钟.
那么当我为longpoll调用Rest API时会发生什么,在2.2分钟后我在浏览器中得到504 http错误.
我正在使用AWS环境,其中我有一个安装在AWS EC2实例中的ELB和HAProxy.
根据AWS doc,它表示ELB的默认空闲连接超时为60秒.所以我把它增加到最多30分钟.
而且它说,
如果您使用HTTP和HTTPS侦听器,我们建议您为EC2实例启用keep-alive选项.您可以在Web服务器设置或EC2实例的内核设置中启用keep-alive.
因此,将上面的代码片段中的嵌入式tomcat保持活动超时增加到30.2分钟
所以现在我希望我的长轮询请求能够完成,而不会出现504错误.但是我仍然在浏览器中出现504错误?
参考:AWS开发指南