java 如何实现带有异常和try catch的重试机制

soat7uwm  于 2023-03-16  发布在  Java
关注(0)|答案(1)|浏览(272)

我想做的事:

我想为函数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点)运行它"。
任何帮助将不胜感激,提前感谢。

7rtdyuoh

7rtdyuoh1#

一种方法是,当externalService.getRecord()返回空列表时,在try块中使用while循环,其中10为分钟睡眠时间。如果externalService.getRecord()返回空列表,则使computeValue方法返回null
在这种情况下,您可以保持调度程序在上午7点到9点之间运行

double value = null;

 try {

     while(value == null) {

        value = computeValue(String product);

        if(value == null){
           Thread.sleep(10) //minutes
        }
     }
  } 
    catch {
      log.warn("Record not available yet", ex.getMessage();)
  }

您也可以选中Spring Retry,但必须指定最大重试次数,并且可以将其保留为Integer.MAX

相关问题