Spring boot RestTemplate超时未在30秒以上工作

Spring boot RestTemplate超时未在30秒以上工作,spring-boot,networking,timeout,httpclient,resttemplate,Spring Boot,Networking,Timeout,Httpclient,Resttemplate,当我调用我的服务获取大量数据时,返回响应大约需要80-90秒(这不是一个好的设计,但这是另一个问题)。我试图在客户端将rest模板超时时间增加到120秒以上。客户端是一个spring批处理作业。但它不起作用。保持30秒左右的计时是很重要的。当客户端在本地计算机上,而我正在调用的服务正在服务器上运行时,就会发生这种情况。当客户机和服务位于服务器上时也是如此。错误:我获取504网关异常超时。我调用的服务工作正常,只是返回数据需要太多时间。 但是当客户端和服务在本地机器上运行时,超时工作正常。有人知道

当我调用我的服务获取大量数据时,返回响应大约需要80-90秒(这不是一个好的设计,但这是另一个问题)。我试图在客户端将rest模板超时时间增加到120秒以上。客户端是一个spring批处理作业。但它不起作用。保持30秒左右的计时是很重要的。当客户端在本地计算机上,而我正在调用的服务正在服务器上运行时,就会发生这种情况。当客户机和服务位于服务器上时也是如此。错误:我获取504网关异常超时。我调用的服务工作正常,只是返回数据需要太多时间。 但是当客户端和服务在本地机器上运行时,超时工作正常。有人知道这是什么原因吗

以上是守则的相关部分

下面是我调试后的发现
  • 我认为代码不是这里的问题,因为它在本地工作(可能需要添加更多代码以使其在本地机器之外工作?)
  • 当我尝试减少超时时间(如5秒)时,它也会起作用。但在本地计算机和服务器上都无法在120秒超时-->下工作 总之:任何低于30-36秒的超时都可以通过restTemplate timeout来控制。当它超过这个值时,就不工作了。 我知道人们实际上实施了超过60秒的超时。所以这应该是可能的。那么我在这里错过了什么? 一些服务器超时限制?如果是这样,有没有办法通过修改代码来覆盖它?我无法更改服务器
    我敢肯定这对你们所有人来说都是一个很好的脑筋急转弯。

    本地没有网络。当连接到服务器时,有一个网络和该网络中的许多不同组件。每个组件也将有一个超时。看起来您的网络中有一些路由器/防火墙,如果没有收到任何消息,它会在x秒后超时(504)。您的代码对此无能为力,您需要尽快开始通过(服务器)发送信息。是否有任何事务正在运行?如果是,则可能是交易timeout@SimonMartinelli这只是一个电话。我没有在我的代码中使用#transaction#或它的依赖项(如果您指的是它的话)to@M.Deinum是的,这就是我害怕的。但有一件事我非常确定,当服务和批处理作业都在服务器上运行时。它们之间没有防火墙。但可能还有其他因素会导致。我希望我能更多地了解网络组件的工作原理:(当事情在同一台服务器上时,并不意味着流量也在本地路由!。很可能它首先通过路由器返回到计算机。特别是在使用主机名/域名等时。因此,在同一台服务器上物理运行的某个事实并不意味着它就这样被访问!本地没有网络rk.当连接到服务器时,有一个网络和该网络中的许多不同组件。每个组件也将有一个超时。看起来网络中有一些路由器/防火墙,如果没有收到任何消息,它将在x秒后超时(504)。您的代码对此无能为力,您需要开始通过(服务器)发送信息更快。是否有任何正在运行的事务?如果是,则可能是该事务timeout@SimonMartinelli这只是一个get调用,我没有在我的代码中使用#transaction或它的依赖项(如果您所指的话)to@M.Deinum是的,这正是我所担心的。但有一件事我很确定,当服务和批处理作业都运行时正在服务器上运行。它们之间没有防火墙。但可能有其他组件导致此问题。我希望了解更多有关网络组件工作原理的信息:(当事情在同一台服务器上时,并不意味着流量也在本地路由!。很可能它首先通过路由器返回到计算机。特别是在使用主机名/域名等时。因此,某些东西在同一台服务器上实际运行,并不意味着它就这样被访问!
     @Controller
    public class RestTemplateConfig {
    
      @Bean
      public RestTemplate restTemplate() {
          return new RestTemplate(clientHttpRequestFactory());
      }
    
      private ClientHttpRequestFactory clientHttpRequestFactory() {
          HttpComponentsClientHttpRequestFactory factory = new HttpComponentsClientHttpRequestFactory();
          factory.setReadTimeout(120000);
          factory.setConnectTimeout(120000);
        return factory;
      }
    }