我有这个简单的基于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));
答案 0 :(得分:2)
尝试增加超时时间。 4秒太少了。 它需要连接,制定数据和返回。所以4秒仅用于连接,当它尝试返回任何内容时,您的应用程序已经断开连接。
将其设置为20秒进行测试。您可以将其设置为更长时间,以便为API提供足够的时间来完成。这并不意味着您的应用程序将耗尽所有连接超时时间。一旦返回结果,它就会完成。 API的设计也不需要很长时间。他们将执行任务并尽快返回结果
答案 1 :(得分:1)
默认值和最大值与服务器无关。这取决于客户端平台,但大约一分钟。你可以减少它,但不能增加它。四秒太短了。在大多数情况下,它应该在几十秒内测量。
缺少或更长的连接超时不会导致任何类型的服务器错误。你在这里咆哮着错误的树。
答案 2 :(得分:1)
连接超时意味着您的程序在指定的时间内根本无法连接到服务器。 可以配置超时,就像您说的那样,某些系统可能需要更长的时间才能连接,如果事先已知,则可以允许。否则,超时会起到防范,以防止应用程序永远等待,这在大多数情况下并不能提供良好的用户体验。
通常可以配置单独的超时来读取数据(套接字超时)。它们并不包含在内。
解决您的问题:
检查服务器是否正在运行并接受传入连接。
您可能希望使用curl
或根据浏览器尝试连接的内容。
如果一个工具可以连接,但另一个工具无法连接,请检查防火墙设置并确保允许来自Java程序的传出连接。测试这是否是一个问题的最简单方法是暂时禁用防病毒和防火墙工具 。如果这允许连接,您将需要关闭FW,或者更好地添加相应的例外。
在测试时将超时设置为更高的设置(或尝试将其设置为0,这被解释为无限)。一旦你有了它,你可以考虑调整它以反映你的服务器规格和可用性要求。
编辑:
我意识到这并不一定有帮助,因为你最终连接了。我将保留上述信息作为一般信息。
我能够尝试连接到API多长时间以及它依赖于什么?
最有可能是托管API的服务器。如果超载,响应时间可能会延长。
这20秒来自哪里?
这又取决于API服务器。它可能是随机的,或者它可能在发现自己处于错误状态之前的一段固定时间内处理每个请求。在这种情况下,每次可能需要20秒。
如果API在40分钟后响应,我将无法捕捉到特定时刻并且会丢失数据。我不希望这种情况发生。我有什么选择?