我想通过Vertx中的EventBus发送多个消息,但要同步。我想发送一条消息,等待它,并发送下一条消息。地址是一样的。默认情况下,我该怎么做?还是有必要使用executeBlocking代码?
这是我的代码。
public class EventBusSync {
private Vertx vertx = Vertx.vertx();
private static final String SERVICE_ADDRESS = "service.worker";
public void sentViaEvBus() {
String message1 = "message1";
String message2 = "message2";
String reply1 = sendCommand(SERVICE_ADDRESS,message1);
String reply2 = sendCommand(SERVICE_ADDRESS,message2);
}
private String sendCommand(String address, String command) {
String message;
vertx.eventBus().send(address,command, handler -> {
if(handler.succeeded()) {
log.info("success");
} else {
log.error("error",handler.cause());
throw new RuntimeException("ERROR");
}
message = handler.result.body();
});
return message;
}
}
所以在这里,如果发送了第一个命令,并且正在发生某些事情,我想中断下一个事件总线的发送。
谢谢
答案 0 :(得分:2)
使用CompleteFuture
private String sendCommand(String address, String command) {
CompletableFuture<String> completableFuture = new CompletableFuture<>();
vertx.eventBus().<String>send(address, command, asyncResult -> {
if (asyncResult.succeeded()) {
completableFuture.complete(asyncResult.result().body());
} else {
completableFuture.completeExceptionally(asyncResult.cause());
}
});
try {
return completableFuture.get();
} catch (Exception e) {
throw new RuntimeException(e);
}
}
请确保虽然未在Vert.x事件循环上调用此代码,因为get()
将一直阻塞,直到知道答复为止。
答案 1 :(得分:0)
在这里,您将找到演示Vert.x-Sync实际操作的示例。
[...]
这表明使用 awaitResult 获得发送事件总线消息并同步返回答复。
答案 2 :(得分:0)
EventBus
用于异步消息传递(发布/订阅消息传递,点对点和请求-响应消息传递)。强制同步动作没有意义。
如果要同步响应,如果您在同一JVM中,则只需在另一个Java类中调用一个方法即可。