Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/38.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring重试在RestController中不工作_Spring_Spring Retry - Fatal编程技术网

Spring重试在RestController中不工作

Spring重试在RestController中不工作,spring,spring-retry,Spring,Spring Retry,我正在尝试spring重试,但我面临一个奇怪的问题。在Rest控制器内的方法上使用重试注释时,重试不起作用。但是,如果我将该方法移动到一个单独的服务类,它就会工作。以下代码不起作用: @RestController public class HelloController { @RequestMapping(value = "/hello") public String hello() { return getInfo(); } @Retrya

我正在尝试spring重试,但我面临一个奇怪的问题。在Rest控制器内的方法上使用重试注释时,重试不起作用。但是,如果我将该方法移动到一个单独的服务类,它就会工作。以下代码不起作用:

@RestController
public class HelloController {

    @RequestMapping(value = "/hello")
    public String hello() {
        return getInfo();
    }

    @Retryable(RuntimeException.class)
    public String getInfo() {
        Random random = new Random();
        int r = random.nextInt(2);
        if (r == 1) {
            throw new RuntimeException();
        } else {
            return "Success";
        }
    }
}
但以下情况确实如此:

@RestController
public class HelloController {

    @Autowired
    private SomeService service;

    @RequestMapping(value = "/hello")
    public String hello() {
        String result = service.getInfo();
        return result;
    }
}

@Service
public class SomeService {

    @Retryable(RuntimeException.class)
    public String getInfo() {
        Random random = new Random();
        int r = random.nextInt(2);
        if (r == 1) {
            throw new RuntimeException();
        } else {
            return "Success";
        }
    }
}

我的问题是为什么
@Retryable
在控制器中使用时不起作用?

您看到的问题是由于如何调用
getInfo()
方法

在第一个示例中,您正在同一个spring托管bean中调用
getInfo()
。在第二个示例中,您正在从另一个spring管理的bean调用
getInfo()
。这种区别是微妙的,但非常重要,很可能是什么导致了你的问题

当您使用
@Retryable
注释时,Spring正在围绕原始bean创建一个代理,以便它们可以在特殊情况下进行特殊处理。在这种特定的情况下,Spring应用一个通知,将调用委托给实际的方法,捕获它可能抛出的
RuntimeException
,并根据
@Retryable
注释的配置重试方法调用

在您的案例中,此代理很重要的原因是只有外部调用方才能看到代理建议。您的bean不知道它是代理的,只知道它的方法正在被(代理通知)调用。当bean对自身调用方法时,不涉及进一步的代理,这就是为什么实际上不会发生重试