java - 我如何使用重试策略重构方法。不使用第三方

标签 java

我想知道如何使用重试 lambda 重构此方法[不使用第 3 方重试引擎]。

(类似于 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;
}

你能帮忙吗? 谢谢

最佳答案

简化代码的主要方法是提取 while 循环内的所有代码并将其放入单独的方法中,例如“尝试连接”。然后,如果需要,您可以使用 lambda,如下所示:

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

关于java - 我如何使用重试策略重构方法。不使用第三方,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42678472/

相关文章:

java - Auth0:使用算法签名时无法生成 token 的签名:SHA256withECDSA

java - SingleNodeIntegrationTestSupport 和作业

java - 计算机如何轻松生成加密 key ?

java - 使用 Java 8,打印文件中所有行的最首选和最简洁的方法是什么?

java - 除以 2 个数字不返回正确

java - 上传多种形式数据

java - 应用程序无法在 Activity 设备(Samsung Galaxy grand 2)上运行

Java `InvocationTargetException` 通过反射进行类实例化

java - 在格式化程序对象中使用 "\n"

javascript - 为什么java无法解密CryptoJS加密数据?