Java函数式编程实现一个通用的重试方法

452 阅读1分钟

在后端应用中经常需要实现将一个方法,特别是网络链接相关方法增加重试机制、功能并不复杂,但是每次都需要在指定方法里通过写for循环或者递归方法等方法解决。那么如何优雅的完成重试机制,希望可以定义一个方法,该方法以函数接口作为参数,以及最大重试次数和重试之间的延迟。

以下是一个示例实现

public static <T> T retry(Supplier<T> operation, int maxRetries, long delayMillis) throws Exception {
    int retries = 0;
    while (true) {
        try {
            T t = operation.get();
            return t;
        } catch (Exception e) {
            if (++retries >= maxRetries) {
                throw e;
            }
            Thread.sleep(delayMillis);
        }
    }
}

这个方法使用了Java的泛型和函数式接口。它接受一个Supplier类型的参数operation,该类型表示一个无参数的函数,返回类型为T。在方法中,我们使用一个while循环来重试operation,并在每次重试之间等待一段时间。如果operation成功执行,则返回其结果。如果operation抛出异常,则将异常抛出,如果达到最大重试次数后仍然失败,则抛出最后一个异常。这个方法可以用于任何需要重试的操作,只需要将操作封装在一个Supplier中,并将其作为参数传递给retry方法即可。

以上方法在多线程情况下可能会出现线程安全问题,其原因是因为retries是一个共享变量,在进行++retries操作的时候可以对其进行加锁操作,解决线程安全问题