有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

我对另一个服务的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

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


共 (1) 个答案

  1. # 1 楼答案

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

    Client-> Users Service -> Some Other Service

    客户检查:

    “其他服务”检查: 如果设置了限制/速率限制以避免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"/>
    

    瞧!这对我很管用