Spring @Retryable - 调用时如何记录

作者:编程家 分类: spring 时间:2025-07-25

使用 Spring 的 @Retryable 注解可以实现对方法调用的重试。当方法调用失败时,可以通过 @Retryable 注解来配置重试的次数和延迟时间,以及指定需要重试的异常类型。在重试过程中,我们还可以记录重试的次数和异常信息,以便后续分析和排查问题。

使用 @Retryable 注解

首先,我们需要在 Spring 的配置文件中启用注解驱动。在 XML 配置文件中,可以添加以下配置:

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xmlns:context="http://www.springframework.org/schema/context"

xsi:schemaLocation="http://www.springframework.org/schema/beans

http://www.springframework.org/schema/beans/spring-beans.xsd

http://www.springframework.org/schema/context

http://www.springframework.org/schema/context/spring-context.xsd">

在 Java 类中,我们需要添加 @Retryable 注解来标识需要重试的方法。同时,我们还可以使用 @Recover 注解来标识重试失败后的处理方法。下面是一个简单的示例:

java

import org.springframework.retry.annotation.Backoff;

import org.springframework.retry.annotation.Recover;

import org.springframework.retry.annotation.Retryable;

public class RetryableService {

private int retryCount = 0;

@Retryable(value = {CustomException.class}, maxAttempts = 3, backoff = @Backoff(delay = 1000))

public void doSomething() throws CustomException {

retryCount++;

System.out.println("重试次数:" + retryCount);

throw new CustomException("方法调用失败");

}

@Recover

public void recover(CustomException e) {

System.out.println("重试失败,进行恢复操作");

}

}

public class CustomException extends Exception {

public CustomException(String message) {

super(message);

}

}

在上面的示例中,我们定义了一个 RetryableService 类,其中包含了一个需要重试的方法 doSomething() 和一个重试失败后的处理方法 recover()。doSomething() 方法通过 @Retryable 注解进行配置,指定了需要重试的异常类型为 CustomException,最大重试次数为 3 次,并且在每次重试之间添加了 1 秒的延迟时间。在方法中,我们通过 retryCount 记录重试的次数,并且在抛出异常之前打印出重试次数。recover() 方法使用 @Recover 注解进行配置,用于处理重试失败后的逻辑。

记录重试信息

为了记录重试的次数和异常信息,我们可以使用 Spring 的 LoggerFactory 来输出日志。在 doSomething() 方法中,我们可以添加如下代码来记录重试的信息:

java

import org.slf4j.Logger;

import org.slf4j.LoggerFactory;

private static final Logger logger = LoggerFactory.getLogger(RetryableService.class);

@Retryable(value = {CustomException.class}, maxAttempts = 3, backoff = @Backoff(delay = 1000))

public void doSomething() throws CustomException {

retryCount++;

logger.info("重试次数:{}", retryCount);

throw new CustomException("方法调用失败");

}

在上面的代码中,我们通过 LoggerFactory.getLogger() 方法获取到了一个 Logger 对象,并将其命名为 RetryableService。然后,我们使用 logger.info() 方法来输出重试的次数,使用占位符 {} 来动态替换重试次数的值。

案例代码

下面是一个完整的示例代码,演示了如何使用 Spring 的 @Retryable 注解来进行方法调用的重试,并且记录重试的次数和异常信息:

java

import org.slf4j.Logger;

import org.slf4j.LoggerFactory;

import org.springframework.retry.annotation.Backoff;

import org.springframework.retry.annotation.Recover;

import org.springframework.retry.annotation.Retryable;

public class RetryableService {

private static final Logger logger = LoggerFactory.getLogger(RetryableService.class);

private int retryCount = 0;

@Retryable(value = {CustomException.class}, maxAttempts = 3, backoff = @Backoff(delay = 1000))

public void doSomething() throws CustomException {

retryCount++;

logger.info("重试次数:{}", retryCount);

throw new CustomException("方法调用失败");

}

@Recover

public void recover(CustomException e) {

logger.error("重试失败,进行恢复操作", e);

}

}

public class CustomException extends Exception {

public CustomException(String message) {

super(message);

}

}

public class Main {

public static void main(String[] args) {

RetryableService service = new RetryableService();

try {

service.doSomething();

} catch (CustomException e) {

e.printStackTrace();

}

}

}

在上面的代码中,我们创建了一个 RetryableService 类,并在其中定义了 doSomething() 方法和 recover() 方法。在 main() 方法中,我们创建了一个 RetryableService 实例,并调用了 doSomething() 方法。由于方法调用失败,会触发重试机制,重试的次数和异常信息会被记录下来。在 recover() 方法中,我们使用 logger.error() 方法来输出重试失败的信息。

使用 Spring 的 @Retryable 注解可以方便地实现方法调用的重试机制。通过配置重试的次数、延迟时间和需要重试的异常类型,以及记录重试的次数和异常信息,可以提高应用程序的稳定性和可靠性。同时,使用日志记录重试信息可以方便后续的分析和排查问题。