我正在尝试使用HTTPClient库为HTTP请求实现重试机制。对于重试机制,我有一个要尝试的网站列表,我将尝试每个网站retries
次。当我从任何请求中收到status 200
时,该过程结束。
我的想法是使用布尔值requestSuccess
和标签requestLabel
。我将设置requestSuccess = true
并在收到requestLabel
时断开status 200
。但是,变量必须为(effectively) final
,并且break
标签在lambda表达式中不可用。
是否有解决此重试机制的方法?
boolean requestSuccess = false;
requestLabel:
for(String site: sites) {
for(int i = 0; i < retries; i++) {
client.request(site, data, requestOptions, (err, res, content) -> {
if(err == null) {
requestSuccess = true;
break requestLabel;
} else {
log(...);
}
})
}
}
if(!requestSuccess) {
log("request failed");
}
一个可能的答案
受提交然后删除的答案的启发,我可以使用类似包装类的解决方案。我认为可以,但是看起来很脏吗?
boolean[] requestSuccess = new boolean[1];
requestLabel:
for(String site: sites) {
for(int i = 0; i < retries; i++) {
if(requestSuccess[0] == true) {
break requestLabel;
}
client.request(site, data, requestOptions, (err, res, content) -> {
if(err == null) {
requestSuccess[0] = true;
} else {
log(...);
}
})
}
}
if(!requestSuccess) {
log("request failed");
}
答案 0 :(得分:1)
lambda变成了它自己的类。就Java解释器而言,就好像您有两个类。
class Main {
public void runstuff() {
labelX:
for(...) {
client.request(new Main$Foo().xyz(.....));
}
}
class Foo {
public xyz(....) {
break labelX; // There is no labelX to break to here in Foo.xyz
}
}
}