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(响应字节);
}
...
}