【发布时间】:2021-04-27 18:52:18
【问题描述】:
我的 GET 方法调用另一个服务时出现 504 网关超时错误。 最近我通过增加超时时间添加了一个修复程序,但这并没有帮助。
这是我尝试过的
public void getUserInformation(final Integer userId) {
HttpClient httpClient = getBasicAuthDefaultHttpClient();
HttpGet httpGet = new HttpGet("http://xxxx/users/"+userId);
httpGet.addHeader("userid", userid);
httpGet.addHeader("secret", secret);
try {
HttpResponse response = httpClient.execute(httpGet);
HttpEntity entity = response.getEntity();
if (entity != null && HttpStatus.OK.value() ==
response.getStatusLine().getStatusCode()) {
ObjectMapper objectMapper = new ObjectMapper();
userInfo = objectMapper.readValue(entity.getContent(),
UserInfo.class);
} else {
logger.error("Call to the service failed: response code:
{}", response.getStatusLine().getStatusCode());
}
} catch (Exception e) {
logger.error("Exception: "+ e);
}
}
public HttpClient getBasicAuthDefaultHttpClient() {
CredentialsProvider provider = new BasicCredentialsProvider();
UsernamePasswordCredentials creds = new
UsernamePasswordCredentials(user, password);
provider.setCredentials(AuthScope.ANY, creds);
//Fix to avoid HTTP 504 ERROR (GATEWAY TIME OUT ERROR) for ECM calls
RequestConfig.Builder requestBuilder = RequestConfig.custom();
requestBuilder.setConnectTimeout(30 * 1000);
requestBuilder.setConnectionRequestTimeout(30 * 1000);
HttpClientBuilder builder = HttpClientBuilder.create();
builder.setDefaultRequestConfig(requestBuilder.build());
builder.setDefaultCredentialsProvider(provider).build();
return builder.build();
}
我在循环中调用此过程来处理记录,这适用于大多数记录,但对于其中的少数 userId 失败。 但是我注意到,当我只运行失败的记录时,一切都会正常工作,不知道这种情况下的问题是什么。
当我收到504时我想再次调用该方法以再次调用它希望下次收到200。
不确定这是不是个好主意。任何建议将不胜感激。
【问题讨论】:
-
想到的一个想法...超时时间每次都不一样吗?我的猜测是,另一个网站正在限制他们将从特定 IP 地址处理的请求数量。也许您可以尝试限制您向网站发出的请求数量。也许哪怕是半秒的延迟就足够了……
-
@hooknc:超时时间每次都不一样,对传入的请求没有任何限制。对于那些失败的请求,我在日志中看到的是它只用了 10 秒并返回了 504 错误!
-
确保代理 URL 正确且没有任何拼写错误。有时像这样的愚蠢错误会让你头疼好几个小时。