如果失败则在给定时间内执行任务

Execute a task for a given time if fails

我正在尝试创建一个能够执行某些任务(一种方法)并在任务失败时重试的服务。

为了创建计时器,我正在使用带石英的计时器服务我无法更改计时器服务)。

定时服务有方法

this.timerService.createTimerRunRepeatedly(
            handledId,
            timerId,
            optionalDescription,
            totalFireCount,
            intervalMiliSeconds,
            offsetMiliseconds,
            optionalCallbackData);

它也可以为创建的定时器注册一个处理程序。

this.timerService.registerHandler(
                  handlerId,
                  firedCallback,
                  expiredCallback);

firedCallback -> (可选)每次触发带有此处理程序的计时器时调用的回调 (final Consumer<T> firedCallback)

expiredCallback -> (可选)在带有此处理程序的计时器最后一次触发后调用的回调 (final Consumer<T> expiredCallback)

我创建了一个新的 TaskRetryService,但我不知道如何将一些方法传递给此 retryService 以使其执行。

由于您正在使用 Spring,请考虑使用 Spring-Retry,它具有处理失败和重试的开箱即用功能。

通过使用 @Retryable(SomeException.class) 注释方法,该方法将在引发 SomeException 时重试。可以进一步自定义它以指定重试尝试,尝试之间的延迟(随机和指数)为@Retryable(maxAttempts=12, backoff=@Backoff(delay=100, maxDelay=500))

对于失败回调 @Recover 将调用带注释的方法。

有关更多实施说明,请查看 readme at github and this 文章。

希望对您有所帮助!

事实上,我成功地做到了,因为我拥有我需要的一切。刚刚注册了一个处理程序

 @PostConstruct
 public void onPostConstruct() {
    handler = this.retryService.registerHandler("1", this::fireCallback, this::expiredCallback);
 }

回调是

private <T> void fireCallback(final T t) {
    System.out.println("fireCallback");
}
private <T> void expiredCallback(final T t) {
    System.out.println("expiredCallback");
}

并使用

创建了计时器
this.retryService.retryTask(handler, "12", 1, 5);

我有重试服务

public void retryTask(final HandlerId<String> handlerId,
                      final String timerId,
                      final Integer intervalTimeMinutes,
                      final Integer retryTimeMinutes) {
    this.timerService.createTimerRunRepeatedly(handlerId,
            timerId,
            "timer",
            getTotalFireCount(intervalTimeMinutes, retryTimeMinutes),
            (int) TimeUnit.MINUTES.toMillis(intervalTimeMinutes),
            0,
            null).thenAccept(timerWasCreated -> {
        if (timerWasCreated) {
            System.out.println("Timer was created");
        } else {
            System.out.println("Error while creating timer");
        }
    });
}

public <T> HandlerId<T> registerHandler(final String handlerId,
                                        final Consumer<T> firedCallback,
                                        final Consumer<T> expiredCallback) {
    return this.timerService.registerHandler(handlerId, firedCallback, expiredCallback);
}