繁体   English   中英

如何在Spring Java中获得RetryTemplate.execute的结果?

[英]How do I get the result of an RetryTemplate.execute in Spring java?

我对java和spring还是相当RetryTemplate.execute ,我试图弄清楚如何接收RetryTemplate.execute命令的结果。 我想返回一个false ,如果执行命令失败,和一个true ,如果它成功了。 我试过在execute函数中分配res的值,但是我得到的只是一个错误,说java: local variables referenced from a lambda expression must be final or effectively final

这是我的代码:

private boolean forward(String message) {
        boolean res;
        retryTemplate.execute(retryCallback -> {
            HttpHeaders headers = new HttpHeaders();
            headers.setContentType(MediaType.APPLICATION_JSON);

            ResponseEntity<String> responses = restTemplate.postForEntity(kafkaForwarderSetting.getUrlEndpoint(),
                    new HttpEntity<>(message, headers), String.class);

            if (responses.getStatusCodeValue() > 300) {
                throw new ForwarderException("Error occurred while forwarding message to endpoint!",
                        retryCallback.getLastThrowable());
            }
            // SET res to true
            return true;
        }, recoveryCallback -> {

            // SET res to false
            return false;
        });

        return res;
    }

从文档看来, executeretryTemplate上返回<T, E extends Throwable> ,并且每当我返回该值(例如return true;在第12行)时,我都应该能够访问该值。

但是我不知道如何获取并打印出retryTemplate本身给了我org.springframework.retry.support.RetryTemplate@5d65976d

编译错误

local variables referenced from a lambda expression must be final or effectively final

意味着在Java中,您无法更改在内部lambda之外声明的变量的引用。

为了避免这种情况,可以使用Apache Commons Lang 3库中的MutableBoolean

首先,将该库包含到您的pom.xml中:

<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-lang3</artifactId>
    <version>3.8.1</version>
</dependency>

然后,使用以下命令将MutableBoolean导入您的类中

import org.apache.commons.lang3.mutable.MutableBoolean;

现在,更换

boolean res;

final MutableBoolean res = new MutableBoolean();

final是可选的,但是好的做法。

要设置值,请写

res.setValue(true);

要么

res.setValue(false);

您可以使用以下三种方法之一来获取lambda之后的值:

boolean isFalse = res.isFalse();
boolean isTrue = res.isTrue();
Boolean value = res.getValue();

请注意, res.getValue()将为您提供一个装箱的Boolean ,而其他两个方法为您提供一个未装箱的boolean 这些对于if语句非常有用。

我希望这有帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM