您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

Java 8-重试方法,直到满足条件(间隔)

Java 8-重试方法,直到满足条件(间隔)

是的,这可以在Java 7中轻松完成,甚至可以使用Java 8进行更清洁的操作。

method方法的参数应为java.util.function.supplier<T>until方法的参数应为java.util.function.Predicate<T>

然后,您可以使用方法引用或lambda表达式来创建Poller,如下所示:

myMethodPoller.poll(pollDurationInteger, intervalInMillisecond)
          .method(payment::getStatus)
          .until (paymentStatus -> paymentStatus.getValue().equals("COMPLETED"))
          .execute();

附带说明一下,如果您要使用Java 8,建议您使用java.time.Duration而不是整数来表示轮询持续时间和间隔。

我还建议您查看https://github.com/rholder/guava- retrying,这是您可能会使用的库。如果没有,这可能是您的API的良好灵感,因为它具有出色的流畅API。

编辑:对问题的更新之后,这是一个简单的实现。我剩下一些部分供您完成TODO。

import java.time.Duration;
import java.util.function.Predicate;
import java.util.function.supplier;

public class MethodPoller<T> {

    Duration pollDurationSec;
    int pollIntervalMillis;

    private supplier<T> pollMethod = null;
    private Predicate<T> pollResultPredicate = null;

    public MethodPoller() {
    }

    public MethodPoller<T> poll(Duration pollDurationSec, int pollIntervalMillis) {
        this.pollDurationSec = pollDurationSec;
        this.pollIntervalMillis = pollIntervalMillis;
        return this;
    }

    public MethodPoller<T> method(supplier<T> supplier) {
        pollMethod = supplier;
        return this;
    }

    public MethodPoller<T> until(Predicate<T> predicate) {
        pollResultPredicate = predicate;
        return this;
    }

    public T execute()
    {
        // TODO: Validate that poll, method and until have been called.

        T result = null;
        boolean pollSucceeded = false;
        // TODO: Add check on poll duration
        // TODO: Use poll interval
        while (!pollSucceeded) {
            result = pollMethod.get();
            pollSucceeded = pollResultPredicate.test(result);
        }

        return result;
    }
}

样品使用:

import static org.junit.Assert.assertTrue;
import java.util.UUID;
import org.junit.Test;

public class MethodPollerTest
{

    @Test
    public void test()
    {
        MethodPoller<String> poller = new MethodPoller<>();
        String uuidThatStartsWithOneTwoThree = poller.method(() -> UUID.randomUUID().toString())
                                                     .until(s -> s.startsWith("123"))
                                                     .execute();
        assertTrue(uuidThatStartsWithOneTwoThree.startsWith("123"));
        System.out.println(uuidThatStartsWithOneTwoThree);
    }
}
java 2022/1/1 18:25:48 有509人围观

撰写回答


你尚未登录,登录后可以

和开发者交流问题的细节

关注并接收问题和回答的更新提醒

参与内容的编辑和改进,让解决方法与时俱进

请先登录

推荐问题


联系我
置顶