我正在努力理解Vert。x framework和我的任务是创建HTTP服务器,该服务器将执行简单的数学计算,并创建一个客户端,该客户端将向该服务器发送多个请求。我需要计算发送所有请求和获得响应所需的时间。我成功地创建了客户机、服务器,并发送请求和检索响应,但在衡量执行这些操作所需的时间方面存在问题。
我的客户端verticle具有以下方法:
@Override
public void start() throws Exception {
WebClient client = WebClient.create(vertx);
IntStream.range(0, MathClientApp.REQUEST_NUMBER)
.forEach(i -> Arrays.stream(Operations.values()).forEach(operation -> {
client
.get(8080, "localhost", operation.getPath())
.addQueryParam("numbers", StringUtils.join(numbers, ","))
.send(result -> {
if (result.succeeded()) {
Double mathResult = Double.parseDouble(result.result().bodyAsString());
if (mathResult.equals(operation.result(numbers))) {
System.out.println("Result: " + result.result().bodyAsString() + " OK!");
} else {
System.out.println("Result: " + result.result().bodyAsString() + " WRONG!");
}
} else {
System.out.println("Communication failed.");
}
});
}));
}
操作
是一个枚举,包含服务器可以执行的所有数学操作。
现在,我发现我需要在向客户端发送请求之前设置开始时间,然后在send()
回调上设置结束时间。因为操作是异步的,所以结束时间可能不会在让它计数差异的那一刻设置,所以我认为这个结束时间需要是Future
对象。所以我添加了一些代码:
@Override
public void start() throws Exception {
WebClient client = WebClient.create(vertx);
IntStream.range(0, MathClientApp.REQUEST_NUMBER)
.forEach(i -> Arrays.stream(Operations.values()).forEach(operation -> {
Long startTime = System.currentTimeMillis();
Future<Long> endTime = Future.future(future -> {
times.add(future.result() - startTime);
});
client
.get(8080, "localhost", operation.getPath())
.addQueryParam("numbers", StringUtils.join(numbers, ","))
.send(result -> {
if (result.succeeded()) {
endTime.complete(System.currentTimeMillis());
Double mathResult = Double.parseDouble(result.result().bodyAsString());
if (mathResult.equals(operation.result(numbers))) {
System.out.println("Result: " + result.result().bodyAsString() + " OK!");
} else {
System.out.println("Result: " + result.result().bodyAsString() + " WRONG!");
}
} else {
System.out.println("Communication failed.");
}
});
}));
}
我的理解如下:在每个请求之前,我以毫秒为单位获取当前时间并创建Future
以使用处理程序结束时间,该处理程序将在结束时间出现时减去这些时间。然后发送请求并设置收到响应时的结束时间,因此调用Future
的处理程序方法,减去时间并将其保存到所有请求中的所有时间列表中。
但是我在Future
的处理程序方法中得到NullPointerException。它在调用服务器之前执行,因此值还不存在。我不明白为什么,Vert. x的官方留档也没有确切说明如何使用此Future
功能。
您应该检查future是否在处理程序方法内完成。所以看起来像这样:
Future<Long> endTime = Future.future(future -> {
if(future.succeeded()) {
times.add(future.result() - startTime);
}
});
在许多函数中,我们都有一个签名,比如,但是我们不能将Future传递给这个函数,对吗?
我想创建一个未来列表,每个未来都可能通过或失败,并整理成功未来的结果。我该怎么做? 问题1)我想等待每个未来完成2)我想从每个成功的未来收集返回值的总和,并忽略失败的回报值(所以我应该得到3)。
背景:我正在使用Vert。Java中的x Core 3.3.3和Web 3.3.3作为EventBus服务器和Vert。使用Javascript在web客户端上安装x 2.0.0和SockJS 1.1.1,以连接到Java EventBus。我已连接,能够发送和接收消息,所有入站和出站流量都已打开。一切正常。 在Java方面,我添加了一个SockJSHandler来处理路由到“/eventbus/
我对RxJava并不完全陌生,但我被一项看似简单的任务所阻碍。 我有一个数据源,它公开了一个反应式API,我所要做的就是获取一些数据,返回它,并在没有其他消息发出时自动关闭连接。 这是我的代码: conn.query()和conn.close()在不同的调度程序中异步执行。此代码不起作用,因为conn.close()返回一个没有订阅服务器的Completable。此外,如果我手动订阅doOnCom