如果失败则在给定时间内执行任务
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);
}
我正在尝试创建一个能够执行某些任务(一种方法)并在任务失败时重试的服务。
为了创建计时器,我正在使用带石英的计时器服务(我无法更改计时器服务)。
定时服务有方法
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);
}