我想做的事:
我想为函数dailyComputeValue
实现一个重试机制。dailyComputeValue
将调用computeValue
。在函数ComputeValue
中有一个部分我们将调用externalService.getRecord
,它可能返回一个空列表。
如果是这种情况,我希望每10分钟重新运行一次函数,直到它不返回空列表(一旦externalService.getRecord在我们运行checkExpiryForADate
时不返回空列表,我们就不会在预定的时间范围内(从上午7点到上午9点)再运行它)
复杂之处在于,在这种情况下我不能使用布尔标志,因为computeValue
需要返回一个double
,所以我考虑在externalService.getRecord
返回一个空列表时抛出一个异常。
我尝试过的:
@Scheduled(cron = "${scheduler: */10 7-8 * * MON-FRI}")
public void dailyComputeValue() {
double value = 0;
try {
value = computeValue(String product);
}
catch {
log.warn("Record not available yet", ex.getMessage();)
}
//to only save to database if there is good value (not from the empty list)
valueRepository.save(value);
}
public Double computeValue(String product)
{
List<Pair<ZonedDateTime, Double>> valueRecords = new ArrayList<>(externalService.getRecord());
if (valueRecords.isEmpty()){
throw new Exception("Record not available yet");
}
//perform some operation to return a double
}
我的代码的问题:
当前代码将每10分钟重试一次computeValue
,但在computeValue返回一个双精度值时不会停止。我不确定如何实现代码以“每10分钟重新运行函数,直到它不返回空列表(一旦externalService.getRecord在我们运行dailyComputeValue
时没有返回空列表,我们将不再在预定的时间范围内(从上午7点到上午9点)运行它"。
任何帮助将不胜感激,提前感谢。
1条答案
按热度按时间7rtdyuoh1#
一种方法是,当
externalService.getRecord()
返回空列表时,在try
块中使用while
循环,其中10
为分钟睡眠时间。如果externalService.getRecord()
返回空列表,则使computeValue
方法返回null
在这种情况下,您可以保持调度程序在上午7点到9点之间运行
您也可以选中Spring Retry,但必须指定最大重试次数,并且可以将其保留为
Integer.MAX
。