2017-03-08 36 views
1

我不知道我怎麼能重構這個方法與重試lambda [不使用第三方重試引擎]。我如何重構帶重試策略的方法。沒有使用第三方

(財產以後像拉姆達是獲取將作爲參數傳入該方法通過在更實用的風格做了同樣的事情

public static Connection createDbConnection(JobConfiguration jobConfiguration, ArrayList<String> hostsIps) { 

    Connection retConnection = null; 

    Properties connectionProperties = new Properties(); 

    connectionProperties.put("user", jobConfiguration.getDbConfiguration().getUserName()); 
    connectionProperties.put("password", jobConfiguration.getDbConfiguration().getPassword()); 
    connectionProperties.put("ConnectionLoadBalance", 1); 
    int attempts = 0; 
    while (++attempts <= hostsIps.size()) { 
     try { 
      String connectionString = String.format("jdbc:vertica://%s:%s/%s", 
        hostsIps.get(attempts - 1), 
        jobConfiguration.getDbConfiguration().getPort(), 
        jobConfiguration.getDbConfiguration().getDbName()); 

      retConnection = DriverManager.getConnection 
        (
          connectionString, 
          connectionProperties 
        ); 
      retConnection.setAutoCommit(false); 
      break; 
     } catch (Exception ex) { 
      LOGGER.error("Failed to connect to node - {}" + hostsIps.get(attempts - 1) + ex); 
     } 
    } 
    return retConnection; 
} 

你能幫助嘗試的次數? 感謝

回答

1

主要這將簡化你的代碼是提取你的while循環中的所有代碼,並把它放在一個單獨的方法,例如「tryConnect」,然後你可以使用lambda,如果需要,如下:

Optional<Connection> retConnection = hostIps.stream().sequential() 
    .map(ip -> tryConnect(ip, jobConfiguration, connectionProperties)) 
    .filter(Objects::nonNull).findFirst(); 
return retConnection.orElse(null);