Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.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
Java 为什么不能在lambda表达式中使用“break label”?有解决办法吗?_Java_Asynchronous_Lambda_Httpclient_Netty - Fatal编程技术网

Java 为什么不能在lambda表达式中使用“break label”?有解决办法吗?

Java 为什么不能在lambda表达式中使用“break label”?有解决办法吗?,java,asynchronous,lambda,httpclient,netty,Java,Asynchronous,Lambda,Httpclient,Netty,我正在尝试使用HTTPClient库实现HTTP请求的重试机制。对于重试机制,我有一个要尝试的网站列表,我将对每个网站进行重试次。当我收到来自任何请求的状态200时,该过程结束 我的想法是使用布尔值requestSuccess和标签requestLabel。当我收到状态200时,我将设置requestSuccess=true并断开requestLabel。但是,变量必须是(有效)final,并且break标签在lambda表达式中不可用 是否有任何解决办法来实现这种重试机制? boolean r

我正在尝试使用HTTPClient库实现HTTP请求的重试机制。对于重试机制,我有一个要尝试的网站列表,我将对每个网站进行
重试
次。当我收到来自任何请求的
状态200
时,该过程结束

我的想法是使用布尔值
requestSuccess
和标签
requestLabel
。当我收到
状态200
时,我将设置
requestSuccess=true
并断开
requestLabel
。但是,变量必须是
(有效)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=false;
请求标签:
用于(字符串站点:站点){
for(int i=0;i{
if(err==null){
请求成功=真;
打破标签;
}否则{
对数(…);
}
})
}
}
if(!requestSuccess){
日志(“请求失败”);
}
一个可能的答案

受提交然后删除答案的启发,我可以使用包装类的解决方案。我想它会管用,但它看起来很脏

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");
}
boolean[]requestSuccess=new boolean[1];
请求标签:
用于(字符串站点:站点){
for(int i=0;i{
if(err==null){
requestSuccess[0]=true;
}否则{
对数(…);
}
})
}
}
if(!requestSuccess){
日志(“请求失败”);
}

一只羔羊在引擎盖下变成了它自己的同类。就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
         }
    }
}

@安迪克。如果我理解正确,如果一个请求在其中一个站点上匹配,您希望该站点处理它,对吗?在您当前的设置中,您使用的是好运方法,浪费了许多资源。如果你有20个不匹配的站点,如果你幸运的话,你有20个404。我建议你先过滤掉这些网站。然后在适当的站点上尝试该请求。您正在使用哪个http库?谢谢您的回复。代码用于反向代理,它接受请求并重新定向到另一个位置。因此,我确实希望请求在大多数情况下都能正常工作,但当它不能正常工作时,我必须重试。我想到了一个可能的答案。你能看一下吗(问题中有更新)?编译器没有抱怨。因为arr是一个数组对象,所以当我在lambda中执行
arr[0]=true时,
arr
(引用)的值不会改变。嗯,true,只要数组不会改变就行了。