Spring 重试带有注释的框架不起作用
Spring Retry Framework with Annotation not Working
我尝试 spring 使用简单 java 类 使用 SimpleRetryPolicy/RetryTemplate 重试框架。它运作良好。所以我想对 Annotations 做同样的事情。注释对我来说从来没有用过。也没有在网上找到太多帮助。下面的代码就像正常的 Java 程序一样工作,在第一次尝试时抛出异常,这不是预期的行为。在抛出异常或从异常中恢复之前,它应该至少尝试过 5 次。不知道我哪里出错了。我需要做任何 XML/spring AOP 配置才能工作吗?会怎样
import org.springframework.context.annotation.Configuration;
import org.springframework.retry.annotation.EnableRetry;
@EnableRetry
@Configuration
public class App {
public static void main(String[] args) throws Exception {
Parentservice p = new SpringRetryWithHystrixService();
String status = p.getStatus();
System.out.println(status);
}
}
import org.springframework.retry.annotation.Retryable;
public interface Parentservice {
@Retryable(maxAttempts=5)
String getStatus() throws Exception;
}
import org.springframework.retry.annotation.Recover;
public class SpringRetryWithHystrixService implements Parentservice{
public static int i=0;
public String getStatus() throws Exception{
System.out.println("Attempt:"+i++);
throw new NullPointerException();
}
@Recover
public static String getRecoveryStatus(){
return "Recovered from NullPointer Exception";
}
}
我在接口和实现的顶部尝试了@Retryable(maxAttempts=5),但没有任何区别。
您的应用程序必须由 Spring 管理,您不能只使用 new ...
Parentservice p = new SpringRetryWithHystrixService();
这是一个 Spring 启动应用...
@SpringBootApplication
@EnableRetry
public class So40308025Application {
public static void main(String[] args) throws Exception {
ConfigurableApplicationContext context = SpringApplication.run(So40308025Application.class, args);
System.out.println(context.getBean(SpringRetryWithHystrixService.class).getStatus());
context.close();
}
}
@Component
public class SpringRetryWithHystrixService {
public static int i = 0;
@Retryable(maxAttempts = 5)
public String getStatus() throws Exception {
System.out.println("Attempt:" + i++);
throw new NullPointerException();
}
@Recover
public static String getRecoveryStatus() {
return "Recovered from NullPointer Exception";
}
}
结果:
Attempt:0
Attempt:1
Attempt:2
Attempt:3
Attempt:4
Recovered from NullPointer Exception
如果您出于某种原因不想使用Spring启动,请使用
@Configuration
@EnableRetry
public class So40308025Application {
public static void main(String[] args) throws Exception {
ConfigurableApplicationContext context = new AnnotationConfigApplicationContext(So40308025Application.class);
System.out.println(context.getBean(SpringRetryWithHystrixService.class).getStatus());
context.close();
}
@Bean
public SpringRetryWithHystrixService service() {
return new SpringRetryWithHystrixService();
}
}
在我的例子中,我必须删除 @EnableRetry 注释才能使它们工作。
我尝试 spring 使用简单 java 类 使用 SimpleRetryPolicy/RetryTemplate 重试框架。它运作良好。所以我想对 Annotations 做同样的事情。注释对我来说从来没有用过。也没有在网上找到太多帮助。下面的代码就像正常的 Java 程序一样工作,在第一次尝试时抛出异常,这不是预期的行为。在抛出异常或从异常中恢复之前,它应该至少尝试过 5 次。不知道我哪里出错了。我需要做任何 XML/spring AOP 配置才能工作吗?会怎样
import org.springframework.context.annotation.Configuration;
import org.springframework.retry.annotation.EnableRetry;
@EnableRetry
@Configuration
public class App {
public static void main(String[] args) throws Exception {
Parentservice p = new SpringRetryWithHystrixService();
String status = p.getStatus();
System.out.println(status);
}
}
import org.springframework.retry.annotation.Retryable;
public interface Parentservice {
@Retryable(maxAttempts=5)
String getStatus() throws Exception;
}
import org.springframework.retry.annotation.Recover;
public class SpringRetryWithHystrixService implements Parentservice{
public static int i=0;
public String getStatus() throws Exception{
System.out.println("Attempt:"+i++);
throw new NullPointerException();
}
@Recover
public static String getRecoveryStatus(){
return "Recovered from NullPointer Exception";
}
}
我在接口和实现的顶部尝试了@Retryable(maxAttempts=5),但没有任何区别。
您的应用程序必须由 Spring 管理,您不能只使用 new ...
Parentservice p = new SpringRetryWithHystrixService();
这是一个 Spring 启动应用...
@SpringBootApplication
@EnableRetry
public class So40308025Application {
public static void main(String[] args) throws Exception {
ConfigurableApplicationContext context = SpringApplication.run(So40308025Application.class, args);
System.out.println(context.getBean(SpringRetryWithHystrixService.class).getStatus());
context.close();
}
}
@Component
public class SpringRetryWithHystrixService {
public static int i = 0;
@Retryable(maxAttempts = 5)
public String getStatus() throws Exception {
System.out.println("Attempt:" + i++);
throw new NullPointerException();
}
@Recover
public static String getRecoveryStatus() {
return "Recovered from NullPointer Exception";
}
}
结果:
Attempt:0
Attempt:1
Attempt:2
Attempt:3
Attempt:4
Recovered from NullPointer Exception
如果您出于某种原因不想使用Spring启动,请使用
@Configuration
@EnableRetry
public class So40308025Application {
public static void main(String[] args) throws Exception {
ConfigurableApplicationContext context = new AnnotationConfigApplicationContext(So40308025Application.class);
System.out.println(context.getBean(SpringRetryWithHystrixService.class).getStatus());
context.close();
}
@Bean
public SpringRetryWithHystrixService service() {
return new SpringRetryWithHystrixService();
}
}
在我的例子中,我必须删除 @EnableRetry 注释才能使它们工作。