我正在尝试创建一个能够执行某个任务(一个方法)的服务,然后重试该任务失败。
为了创建计时器,我使用计时器服务和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以便执行它。
答案 0 :(得分:1)
由于您使用Spring,请考虑使用具有开箱即用功能的Spring-Retry
来处理故障并重试。
通过使用@Retryable(SomeException.class)
注释方法,将在引发SomeException
时重试该方法。它可以进一步自定义,以指定重试尝试,尝试之间的延迟(随机和指数)为@Retryable(maxAttempts=12, backoff=@Backoff(delay=100, maxDelay=500))
对于失败,将调用回调@Recover
带注释的方法。
有关更多实施说明,请查看github上的readme和this文章。
希望这有帮助!
答案 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);
}