Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/video/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何添加修复以避免504网关超时错误_Java_Http Status Code 504 - Fatal编程技术网

Java 如何添加修复以避免504网关超时错误

Java 如何添加修复以避免504网关超时错误,java,http-status-code-504,Java,Http Status Code 504,我对另一个服务的GET方法调用出现504网关超时错误。 最近,我通过增加超时时间添加了一个修复程序,但这没有帮助 这就是我尝试过的 public void getUserInformation(final Integer userId) { HttpClient httpClient = getBasicAuthDefaultHttpClient(); HttpGet httpGet = new HttpGet("http://xxxx/users/"+us

我对另一个服务的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();
  }
我在一个循环中调用这个进程来处理记录,这对大多数记录都有效,但对其中的少数用户ID无效。 但我注意到,当我只运行失败的记录时,一切都会正常工作,不确定在这种情况下会出现什么问题

当我收到504时,我想再次调用该方法,希望下次能收到200


不确定这是不是个好主意。如果您有任何建议,我们将不胜感激。

根据状态代码的描述,当您有一系列服务器进行通信以处理请求,并且其中一个节点(不是您正在呼叫的服务器,而是稍后的某个)无法及时处理请求时,将返回该建议

我想你现在的处境可以描述如下

CLIENT -> USERS SERVICE -> SOME OTHER SERVICE
问题是,
其他一些服务
处理您的请求花费的时间太长。
USERS服务
会在某个时间点放弃,并返回此特定的状态代码以指示此情况

据我所知,你几乎无法缓解这个问题。您需要联系
用户服务的所有者
并要求他们增加超时时间,或者联系
其他服务的所有者
并要求他们提高性能

至于为什么会不时发生这样的错误。您可能与其他客户端一起,正在传递性地重载其他服务,导致它处理请求的速度越来越慢。或者可能是
某些其他服务
启用了节流或速率限制,以防止拒绝服务攻击。通过向
用户服务
发出过多请求,您可能正在使用它的配额


当然,所有这些都是推测,而不知道您的实际情况。

根据状态代码的描述,当您有一系列服务器进行通信以处理请求和其中一个节点(不是您正在调用的服务器,而是稍后的某个服务器)时,会返回状态代码无法及时处理请求

我想你现在的处境可以描述如下

CLIENT -> USERS SERVICE -> SOME OTHER SERVICE
问题是,
其他一些服务
处理您的请求花费的时间太长。
USERS服务
会在某个时间点放弃,并返回此特定的状态代码以指示此情况

据我所知,你几乎无法缓解这个问题。您需要联系
用户服务的所有者
并要求他们增加超时时间,或者联系
其他服务的所有者
并要求他们提高性能

至于为什么会不时发生这样的错误。您可能与其他客户端一起,正在传递性地重载其他服务,导致它处理请求的速度越来越慢。或者可能是
某些其他服务
启用了节流或速率限制,以防止拒绝服务攻击。通过向
用户服务
发出过多请求,您可能正在使用它的配额


当然,所有这些都是猜测,不知道你的实际情况。

我以前也遇到过同样的情况,下面是我为解决这个问题所做的检查。我将为上述类比添加更多细节

客户端->用户服务->其他服务

客户端检查:

  • httpclient-我看到您正在使用RequestConfig.Builder设置客户端超时。(在您的情况下就可以了)
  • jersey客户端-如果有人使用jersey客户端,可以将其配置为
“其他一些服务”检查: 如果设置了限制/速率限制以避免DOS攻击。然后你需要增加其他服务的超时时间。我在AWS上使用了tomcat服务器:更改了yaml文件中的空闲超时

metadata:
    annotations:
        #below for openshift which worked for me        
        haproxy.router.openshift.io/timeout:20000
        #below for kubernetes timeout in ELB
        service.beta.kubernetes.io/aws-load-balancer-connection-idle-timeout:20000 
还更改了tomcat上的连接器超时

 <Connector connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443"/>


瞧!这对我很有效。

我以前也遇到过同样的问题,下面是我为解决这个问题所做的检查。我将为上述类比添加更多细节

客户端->用户服务->其他服务

客户端检查:

  • httpclient-我看到您正在使用RequestConfig.Builder设置客户端超时。(在您的情况下就可以了)
  • jersey客户端-如果有人使用jersey客户端,可以将其配置为
“其他一些服务”检查: 如果设置了限制/速率限制以避免DOS攻击。然后你需要增加其他服务的超时时间。我在AWS上使用了tomcat服务器:更改了yaml文件中的空闲超时

metadata:
    annotations:
        #below for openshift which worked for me        
        haproxy.router.openshift.io/timeout:20000
        #below for kubernetes timeout in ELB
        service.beta.kubernetes.io/aws-load-balancer-connection-idle-timeout:20000 
还更改了tomcat上的连接器超时

 <Connector connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443"/>


瞧!这对我很有用。

我想到了一个想法。。。每次超时都不同吗?我的猜测是,另一个网站正在限制他们将从特定ip地址处理的请求数量。也许你可以尝试限制你对网站的请求数量。也许半秒钟的延迟就足够了…@hooknc:Timeout并不是每次都不同,传入的请求也没有任何限制。对于那些失败的请求,我在日志中看到的是,只花了10秒,就返回了504个错误!确保代理URL是正确的,并且没有任何拼写错误。有时候,像这样愚蠢的错误会让你头疼好几个小时。一个想到的想法。。。每次超时都不同吗?我的猜测是,另一个网站正在限制他们将从特定ip地址处理的请求数量。也许你可以试试老鼠