任何服务器的最大连接超时是多少?

时间:2018-05-10 10:37:36

标签: java spring multithreading http connection

我有这个简单的基于Spring启动的Web应用程序,它可以从多个API下载数据。他们中的一些人没有及时回复,因为connectionTimeout设置为4秒 一旦我摆脱connectionTimeout设置,我就会在20秒左右后获得异常。

所以,我的问题是,我能够尝试连接到API多长时间以及它依赖于什么?那20秒来自哪里?如果API在40分钟后响应并且我将无法捕捉到特定时刻并且将丢失数据,该怎么办?我不希望这种情况发生。我有什么选择?

这是设置连接的代码。没什么特别的。

HttpComponentsClientHttpRequestFactory clientHttpRequestFactory = new HttpComponentsClientHttpRequestFactory(HttpClientBuilder.create().build());
    clientHttpRequestFactory.setConnectTimeout(4000);
    RestTemplate restTemplate = new RestTemplate(clientHttpRequestFactory);

然后我通过以下方式检索值:

 myObject.setJsonString(restTemplate.getForObject(url, String.class));

3 个答案:

答案 0 :(得分:2)

尝试增加超时时间。 4秒太少了。 它需要连接,制定数据和返回。所以4秒仅用于连接,当它尝试返回任何内容时,您的应用程序已经断开连接。

将其设置为20秒进行测试。您可以将其设置为更长时间,以便为API提供足够的时间来完成。这并不意味着您的应用程序将耗尽所有连接超时时间。一旦返回结果,它就会完成。 API的设计也不需要很长时间。他们将执行任务并尽快返回结果

答案 1 :(得分:1)

默认值和最大值与服务器无关。这取决于客户端平台,但大约一分钟。你可以减少它,但不能增加它。四秒太短了。在大多数情况下,它应该在几十秒内测量。

缺少或更长的连接超时不会导致任何类型的服务器错误。你在这里咆哮着错误的树。

答案 2 :(得分:1)

连接超时意味着您的程序在指定的时间内根本无法连接到服务器。 可以配置超时,就像您说的那样,某些系统可能需要更长的时间才能连接,如果事先已知,则可以允许。否则,超时会起到防范,以防止应用程序永远等待,这在大多数情况下并不能提供良好的用户体验。

通常可以配置单独的超时来读取数据(套接字超时)。它们并不包含在内。

解决您的问题:

  1. 检查服务器是否正在运行并接受传入连接。 您可能希望使用curl或根据浏览器尝试连接的内容。

  2. 如果一个工具可以连接,但另一个工具无法连接,请检查防火墙设置并确保允许来自Java程序的传出连接。测试这是否是一个问题的最简单方法是暂时禁用防病毒和防火墙工具 。如果这允许连接,您将需要关闭FW,或者更好地添加相应的例外。

  3. 在测试时将超时设置为更高的设置(或尝试将其设置为0,这被解释为无限)。一旦你有了它,你可以考虑调整它以反映你的服务器规格和可用性要求。

  4. 编辑:

    我意识到这并不一定有帮助,因为你最终连接了。我将保留上述信息作为一般信息。

      

    我能够尝试连接到API多长时间以及它依赖于什么?

    最有可能是托管API的服务器。如果超载,响应时间可能会延长。

      

    这20秒来自哪里?

    这又取决于API服务器。它可能是随机的,或者它可能在发现自己处于错误状态之前的一段固定时间内处理每个请求。在这种情况下,每次可能需要20秒。

      

    如果API在40分钟后响应,我将无法捕捉到特定时刻并且会丢失数据。我不希望这种情况发生。我有什么选择?

    1. 使用更可靠的API,可能需要支付服务保证。
    2. 调整连接和套接字超时,以便在事先知道的情况下允许服务器端的功能。
    3. 如果响应真的是40分钟,那么这是一个非常糟糕的服务,但继续这个假设 - 如果数据集很大,请探索API是否提供流回调,从而将OutputStream传入API库方法,它在准备就绪时(异步地)写入响应。
    4. 请记住,连接和套接字超时是分开的。连接后,连接超时变得无关紧要(建立套接字)。只要您在套接字超时内开始接收并继续接收数据(数据包到数据包),套接字超时也不会被触发。
    5. 使用无限超时(设置为0),但这可能导致应用程序中的可用性差,以及如果服务器实际上处于脱机状态且永远不会响应则资源泄漏。在这种情况下,你将留下悬空连接。