如果失败,则执行给定时间的任务

时间:2017-03-24 06:34:17

标签: java spring-boot timer quartz-scheduler

我正在尝试创建一个能够执行某个任务(一个方法)的服务,然后重试该任务失败。

为了创建计时器,我使用计时器服务和quartz(我无法更改计时器服务)。

定时服务有方法

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

它还能够为创建的计时器注册处理程序。

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

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

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

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

2 个答案:

答案 0 :(得分:1)

由于您使用Spring,请考虑使用具有开箱即用功能的Spring-Retry来处理故障并重试。

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

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

有关更多实施说明,请查看github上的readmethis文章。

希望这有帮助!

答案 1 :(得分:0)

实际上,由于我拥有了所需的一切,因此我设法使其成功。刚刚注册了一个处理程序

 @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);
}