Java HttpHandler正在等待CompletableFuture

Java HttpHandler正在等待CompletableFuture,java,websocket,thread-safety,httphandler,Java,Websocket,Thread Safety,Httphandler,我得到了以下代码 public WebClient extends WebSocketClient{ ... private StringBuilder response; public WebClient(StringBuilder response){ this.response = response; } public void onMessage(ByteBuffer bytes Complet

我得到了以下代码

public WebClient extends WebSocketClient{
...
    private StringBuilder response;
    
    public WebClient(StringBuilder response){
        this.response = response;
    }
    
    public void onMessage(ByteBuffer bytes
    
        CompletableFuture<Void> completableFuture  = CompletableFuture.
            supplyAsync(this::fsupplyAsync)
            .thenApply(this::fThenApply)
            }).exceptionally(t -> {
                return fexceptionally(t);
            }).thenAccept(x -> {
                fthenAccept(x);
            });

        completableFuture.get();
        this.setDone(true);
    
    }
    
...
}

public class handler implements HttpHandler { 
...

    public void handle(HttpExchange httpExchange) throws IOException {
        
        ByteBuffer message;
        ...
        StringBuilder response = new StringBuilder();
        
        WebClient client = new WebClient(response);
        
        client.send(message);
        
        while(!client.isDone()){
            Thread.sleep(2000);
        }
        
        httpExchange.getResponseHeaders().add("Access-Control-Allow-Origin", "*");
        final byte[] responseBytes = response.getBytes();
        httpExchange.sendResponseHeaders(200, responseBytes.length);
        outputStream.write(responseBytes);
    }
    
... 
}
公共WebClient扩展WebSocketClient{
...
私人回应;
公共网络客户端(StringBuilder响应){
这个。反应=反应;
}
消息上的公共无效(字节缓冲)
CompletableFuture CompletableFuture=CompletableFuture。
SupplySync(this::fsupplySync)
.然后应用(此::fThenApply)
}).例外情况(t->{
异常返回fet(t);
}).然后接受(x->{
fthenAccept(x);
});
completableFuture.get();
此.setDone(true);
}
...
}
公共类处理程序实现HttpHandler{
...
公共无效句柄(HttpExchange HttpExchange)引发IOException{
ByteBuffer消息;
...
StringBuilder响应=新建StringBuilder();
WebClient客户端=新的WebClient(响应);
客户端。发送(消息);
而(!client.isDone()){
《睡眠》(2000年);
}
httpExchange.getResponseHeaders().add(“访问控制允许来源”,“*”);
最终字节[]responseBytes=response.getBytes();
httpExchange.SendResponseHeader(200,响应字节长度);
outputStream.write(响应字节);
}
... 
}
我的想法是,我打电话给另一个客户,询问一些信息,等待他的回复,然后展示已经接收和处理的数据

但是我正在寻找一种方法来避免对Thread.sleep的需要,以避免系统中其他代码可能出现的问题


在我将结果写入处理程序之前,是否有其他方法等待WebClient中可比较的未来调用的结果?

我可以使用在客户端中创建的对象上的同步和等待来完成此操作。 正如您所看到的,我在客户端的对象上调用了一个synchronize,并将其置于等待状态。 然后在客户端,当它完成时,我调用notifyall

    public WebClient extends WebSocketClient{
...
    private StringBuilder response;

    Object waitUntlDone = new Object();

    
    public WebClient(StringBuilder response){
        this.response = response;
    }
    
    public void onMessage(ByteBuffer bytes
    
        CompletableFuture<Void> completableFuture  = CompletableFuture.
            supplyAsync(this::fsupplyAsync)
            .thenApply(this::fThenApply)
            }).exceptionally(t -> {
                return fexceptionally(t);
            }).thenAccept(x -> {
                fthenAccept(x);
            });

        completableFuture.get();
        this.setDone(true);
    
        synchronized (this.waitUntlDone){
            this.waitUntlDone.notifyAll();
        }
    }
    
...
}

public class handler implements HttpHandler { 
...

    public void handle(HttpExchange httpExchange) throws IOException {
        
        ByteBuffer message;
        ...
        StringBuilder response = new StringBuilder();
        
        WebClient client = new WebClient(response);
        
        client.send(message);
        
        synchronized (client.waitUntlDone){
            while (!client.isDone()) {
                client.waitUntlDone.wait(2000);
            }
        }
        
        httpExchange.getResponseHeaders().add("Access-Control-Allow-Origin", "*");
        final byte[] responseBytes = response.getBytes();
        httpExchange.sendResponseHeaders(200, responseBytes.length);
        outputStream.write(responseBytes);
    }
    
... 
}
公共WebClient扩展WebSocketClient{
...
私人回应;
Object waitUntlDone=新对象();
公共网络客户端(StringBuilder响应){
这个。反应=反应;
}
消息上的公共无效(字节缓冲)
CompletableFuture CompletableFuture=CompletableFuture。
SupplySync(this::fsupplySync)
.然后应用(此::fThenApply)
}).例外情况(t->{
异常返回fet(t);
}).然后接受(x->{
fthenAccept(x);
});
completableFuture.get();
此.setDone(true);
已同步(this.waitUntlDone){
this.waitUntlDone.notifyAll();
}
}
...
}
公共类处理程序实现HttpHandler{
...
公共无效句柄(HttpExchange HttpExchange)引发IOException{
ByteBuffer消息;
...
StringBuilder响应=新建StringBuilder();
WebClient客户端=新的WebClient(响应);
客户端。发送(消息);
已同步(client.waitUntlDone){
而(!client.isDone()){
client.waitUntlDone.wait(2000);
}
}
httpExchange.getResponseHeaders().add(“访问控制允许来源”,“*”);
最终字节[]responseBytes=response.getBytes();
httpExchange.SendResponseHeader(200,响应字节长度);
outputStream.write(响应字节);
}
... 
}