【发布时间】:2019-11-14 18:42:47
【问题描述】:
我正在尝试使用 HTTPClient 库为 HTTP 请求实现重试机制。对于重试机制,我有一个要尝试的网站列表,我会尝试每个网站retries 次。当我收到来自任何请求的status 200 时,该过程结束。
我的想法是使用布尔值requestSuccess 和标签requestLabel。当我收到status 200 时,我将设置requestSuccess = true 并打破requestLabel。但是,变量必须是 (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");
}
【问题讨论】:
标签: java asynchronous lambda httpclient netty