gpt4 book ai didi

java - 如何使用 websockets 和异步请求将阻塞操作卸载到工作线程 Verticle

转载 作者:太空宇宙 更新时间:2023-11-04 13:32:24 34 4
gpt4 key购买 nike

我使用 Vert.x 3 实现 websockets。

场景很简单:从客户端打开套接字,在顶点 Verticle Worker 上执行一些“阻塞”工作,并在完成响应后向客户端提供答案(通过打开的套接字)

请告诉我我这样做是否正确:

已创建 VertxWebsocketServerVerticle。一旦 websocket 打开并收到来自客户端的请求,我就会使用 eventBus 并将消息传递给

EventBusReceiverVerticle。我正在那里进行阻塞操作。

我实际上如何将响应发送回 VertxWebsocketServerVerticle 并将其发送回客户端?

代码:

主类:

 public static void main(String[] args) throws InterruptedException {
Vertx vertx = Vertx.vertx();
vertx.deployVerticle(new EventBusReceiverVerticle("R1"),new DeploymentOptions().setWorker(true));
vertx.deployVerticle(new VertxWebsocketServerVerticle());
}

VertxWebsocketServerVerticle:

public class VertxWebsocketServerVerticle extends AbstractVerticle {


public void start() {
vertx.createHttpServer().websocketHandler(webSocketHandler -> {

System.out.println("Connected!");
Buffer buff = Buffer.buffer().appendInt(12).appendString("foo");
webSocketHandler.writeFinalBinaryFrame(buff);
webSocketHandler.handler(buffer -> {
String inputString = buffer.getString(0, buffer.length());
System.out.println("inputString=" + inputString);
vertx.executeBlocking(future -> {
vertx.eventBus().send("anAddress", inputString, event -> System.out.printf("got back from reply"));
future.complete();
}, res -> {
if (res.succeeded()) {
webSocketHandler.writeFinalTextFrame("output=" + inputString + "_result");
}
});

});
}).listen(8080);
}


@Override
public void stop() throws Exception {
super.stop();
}
}

EventBusReceiverVerticle:

public class EventBusReceiverVerticle extends AbstractVerticle {

private String name = null;

public EventBusReceiverVerticle(String name) {
this.name = name;
}

public void start(Future<Void> startFuture) {
vertx.eventBus().consumer("anAddress", message -> {
System.out.println(this.name +
" received message: " +
message.body());
try {
//doing some looong work..
Thread.sleep(10000);
System.out.printf("finished waiting\n");
startFuture.complete();
} catch (InterruptedException e) {
e.printStackTrace();
}
});
}
}

我总是得到:

WARNING: Message reply handler timed out as no reply was received - it will be removed

github项目位于:https://github.com/IdanFridman/VertxAndWebSockets谢谢你,射线。

最佳答案

由于您正在阻止您的 websocket 处理程序,直到它收到对 EventBus 发送的消息的回复,而实际上,直到设置的延迟 10s 圈后才会收到回复,因此您肯定会收到警告,因为事件总线的回复处理程序将超时 -> 消息已发送,但在超时延迟之前未收到响应。

实际上,我不知道您是否只是在尝试 Vert.x 工具包,或者您正在尝试满足某些要求,但您肯定必须调整代码以符合 Vert.x 精神:

  • 首先,您最好不要阻塞,直到 Websocket 处理程序收到消息为止,请记住,对于 Vert.x 而言,一切都是异步的。
  • 为了 hibernate 一段时间,请使用Vert.x方式,而不是Thread.sleep(delay),即vertx.setTimer(...)

关于java - 如何使用 websockets 和异步请求将阻塞操作卸载到工作线程 Verticle,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32045716/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com