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

2024-07-03

我想创建一个类,它可以运行一个方法,直到满足有关返回值的条件。

它应该看起来像这样

methodPoller.poll(pollDurationSec, pollIntervalMillis)
            .method(dog.bark())
            .until(dog -> dog.bark().equals("Woof"))
            .execute();

我的方法轮询器看起来有点像这样 () // 遵循 GuiSim 答案

public class MethodPoller {
    Duration pollDurationSec;
    int pollIntervalMillis;


    public MethodPoller() {
    }

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

    public <T> MethodPoller method(Supplier<T> supplier) {

        return this;
    }

    public <T> MethodPoller until(Predicate<T> predicate) {

        return this;
    }
}

但我很难从这里开始。
如何实现对通用方法的重试,直到满足条件?
Thanks.


是的,这可以在 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 https://github.com/rholder/guava-retrying这是一个你也许可以使用的库。如果没有,它可能会对您的 API 产生很好的启发,因为它具有良好流畅的 API。

编辑: 更新问题后,这是一个简单的实现。我留了一些部分作为待办事项供您完成。

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);
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java 8 - 重试方法,直到满足条件(间隔) 的相关文章

随机推荐

  • 我可以通过外部计费绕过 Apple 的应用内购买机制吗?

    这不是一个编程问题 只是对 iOS 中的应用内购买功能进行澄清 我计划开发一款包含优质内容的应用程序 仅当用户使用凭据进行身份验证时才能使用我的应用程序 我是否可以仅根据身份验证提供优质内容 付费内容 我需要用户通过另一个网络应用程序进行付
  • Phonegap 3.0 InAppBrowser - 不提供用户关闭的方式

    我的应用程序中的 inAppBrowser 工作得很好 但是 我升级了一些东西 现在它打开 URL 而没有任何方式关闭它 你必须杀死该应用程序 我尝试过很多变体 window open http cnn com blank location
  • 使用 CoreAnimation 或 OpenGL 弯曲/扭曲视图以实现轮播效果

    现在我正在用一系列视图填充 UIScrollView 需要扭曲视图以使 UIScrollView 看起来像旋转木马 换句话说 当用户滚动时 它需要像一个圆圈 我以前从未做过类似的事情 但我假设 CoreAnimation 是不可能的 并且需
  • 显示具有共享元素动画的片段

    在我的应用程序中 我有这样的代码 final FragmentTransaction transaction getSupportFragmentManager beginTransaction transaction replace R
  • QTableView:按标题索引-1排序

    我正在使用 PyQt4 并且有一个QTableView有 2 列数据 索引有一个额外的列 它来自headerData源模型的函数 为了在单击标题按钮时进行排序 我用代理类包装了我的模型 这工作正常 但我还想通过单击左上角按钮按第一列排序 c
  • Groovy/Grails 通过 HTTP 发布 XML(使用 REST 插件)

    我正在尝试使用基本身份验证将 XML 字符串 HTTP Post 到 WebMethods 服务器 我试图使用位于 HTTP Builder 之上的 REST 插件 我尝试了一些方法 结果都是 0 长度响应 使用 Firefox 海报 我使
  • 如何在不使用 Play 商店的情况下在移动设备上部署 Flutter 应用程序进行测试

    我是颤振开发的新手 我创建了一个使用谷歌地图和设备位置跟踪的示例应用程序 flutter 2 2 和 VS Code 我想通过部署到我的手机上来进行现场测试 我可以知道在不将应用程序发布到 Play 商店的情况下实现此目标的步骤吗 为您的应
  • 使用本地时区将 unix 时间戳转换为 NSdate

    我得到一些start times and end times形式为NSDecimalNumber从 API 请求返回 我已经成功地能够转换这些NSDecimalNumbers into NSDates 但代码没有考虑时区 我需要它使用设备上
  • 为什么 Boolean.prototype 又是一个 Boolean 对象? (字符串和数字也一样,但日期或正则表达式不一样?)

    In ES5 https www ecma international org ecma 262 5 1 index html sec 15 6 4 Boolean prototype是一个布尔对象 布尔原型对象本身就是一个值为 false
  • 执行 IIFE 后变量值错误(带有函数参数)[重复]

    这个问题在这里已经有答案了 在这个例子中 我通过foo bar到 IIFE 它返回正在执行的第一个参数 我正在传递一个被执行的函数 返回this 指着窗口 因此 返回值存储在a应该是window 那么 为什么它要返回我的论点本身呢 var
  • ansible 解析来自 stdout 的文本字符串

    我的问题是 ansible 和解析标准输出 我需要从 ansible play 中捕获标准输出 并解析此输出以获取标准输出中的特定子字符串 然后保存到 var 中 我的具体用例如下 shell vault sh keystore EAP H
  • 乘以 2 的效率

    我应该以几何方式分配内存并将初始大小设置为 1000 当它被填满时 它将扩展到 2000 4000 等 我的问题是 如果我将初始大小设置为 2 倍 即 1024 在效率或其他方面会有什么不同吗 请不要谈论向量和替代分配方法 这只是理论上的
  • SwiftUI:NavigationLink 在 WatchOS 8.1RC 的 Tabview 中立即弹出

    我发现 watchOS 8 1RC 中存在从 TabView 触发的 NavigationLink 的回归 马上就被驳回了 它在 watchOS 8 0 或模拟器 watchOS 8 0 中运行 你知道解决方法吗 谢谢 示例代码 impor
  • 如何修复:无法在字符串上创建属性“标题”

    我正在尝试使用 jspdf 从 json 数据创建 pdf 但这导致了我无法理解的错误 请帮我解决这个问题 Data fileDataSpecific Date 01 Jan 2019 ServerName prlhpcms01 Serve
  • Android Java JNI和C Char数组无法识别该值

    我试图将 char 数组从 java 传递到 c 我已经用谷歌搜索了实现它的方法 但是当我尝试访问数组的值时 该值不正确 事实上 我试图给数组一个字符 就像buffer i z 在android中结果是正确的 顺便说一句 我想要的值是rs2
  • 使用 AUCTeX 在 Emacs 中使用 \cite 的建议

    我想知道当我在 Emacs AUCTeX 中进行 cite 时如何获得建议 当我执行 C c 时 迷你缓冲区会告诉我 本文档中没有有效的参考书目 并且没有可用的默认参考书目 那么我该如何设置这个默认值呢 我有一个单独的文件 其中包含由主文档
  • C : 在空数组中插入/获取元素

    我必须创建一个可以包含通用数据结构的通用数组 如何将通用结构放入 void 数组的空槽中 这是我的代码 struct CircularBuffer int E int S int length total number of item al
  • 将属性默认值注入第 3 方 Vue 组件

    我在我的项目中使用日期选择器组件 基本用法是这样的 date picker language fr v model date 每次我们需要使用日期选择器时 都会重复有几个属性 language例如 所以我希望能够在需要日期选择器时简单地做到
  • 如何获取烧瓶中请求的到达时间戳

    我有一个普通的 Flask 应用程序 只有一个线程来处理请求 有许多请求同时到达 他们排队等待处理 如何获取每个请求在队列中的等待时间 from flask import Flask g import time app Flask name
  • Java 8 - 重试方法,直到满足条件(间隔)

    我想创建一个类 它可以运行一个方法 直到满足有关返回值的条件 它应该看起来像这样 methodPoller poll pollDurationSec pollIntervalMillis method dog bark until dog