gpt4 book ai didi

java - 使用 CountDownLatch 等待从 vertx WebClient 返回的 http 响应

转载 作者:行者123 更新时间:2023-11-28 21:17:09 30 4
gpt4 key购买 nike

我正在为一些 rest api 编写一些测试,我有一个调度程序将我的 rest 请求从 vertx 发送到 WebClient,在某些情况下,我想等待 rest api 的响应返回,然后我才能继续我的断言,分派(dispatch)请求的代码包含在其他类中,所以我没有直接从测试中发出这些请求,我的请求分派(dispatch)器有 2 个实现,一个用于生产,一个用于测试,测试分派(dispatch)器看起来像这样:

public class TestRequestDispatcher extends AbstractRequestDispatcher {

@Override
protected void dispatchRequest(ServerRequest request, ServerRequestEventFactory requestEventFactory) {

request.getSender()
.send(request,
new ServerRequestCallBack() {

@Override
public <T> void onSuccess(T response) {
requestEventFactory.makeSuccess(request, response).fire();
}

@Override
public void onFailure(FailedResponseBean failedResponse) {
requestEventFactory.makeFailed(request, failedResponse).fire();
}
});
}
}

然后这应该调用一些构建 WebClient 的代码并调用其发送方法将请求发送到服务器。

为了等待响应,我决定使用 CountDownLatch 并将我的代码修改为以下内容

public class TestRequestDispatcher extends AbstractRequestDispatcher {

@Override
protected void dispatchRequest(ServerRequest request, ServerRequestEventFactory requestEventFactory) {

CountDownLatch requestWait = new CountDownLatch(1);

request.getSender()
.send(request,
new ServerRequestCallBack() {

@Override
public <T> void onSuccess(T response) {
requestWait.countDown();
requestEventFactory.makeSuccess(request, response).fire();
}

@Override
public void onFailure(FailedResponseBean failedResponse) {
requestWait.countDown();
requestEventFactory.makeFailed(request, failedResponse).fire();
}
});

try {
requestWait.await(20, TimeUnit.SECONDS);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}
}

我在这里使用了一个大的超时时间来确保响应应该在超时时间结束之前返回,所以发生的是我可以断点并看到 WebCLient.send 方法被调用,并且然后它在 requestWait.wait(...) 处暂停,但在 CountDownLatch 超时之前永远不会调用回调。当我期待 WebClient 发送请求时,只要返回响应,它就会调用回调,回调将倒计时并在 timwout 启动之前中断等待。

用普通线程进行测试似乎可以正常工作,我创建了一些具有一些 sleep 时间的可运行类..减去 CountDownTime 锁存器。喜欢下面的

public class SenderWorker implements Runnable {

private CountDownLatch countDownLatch;

public SenderWorker(CountDownLatch countDownLatch) {

this.countDownLatch = countDownLatch;
}

@Override
public void run() {
try {
Thread.sleep(5000L);
countDownLatch.countDown();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}

然后在调度器中:

public class TestRequestDispatcher extends AbstractRequestDispatcher {

@Override
protected void dispatchRequest(ServerRequest request, ServerRequestEventFactory requestEventFactory) {

CountDownLatch requestWait = new CountDownLatch(1);
new Thread(new SenderWorker(requestWait))
.start();

try {
requestWait.await(20, TimeUnit.SECONDS);
System.out.println("i am here");
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}
}

这有效..它调用 run 方法.. hibernate ,然后调用 requestWait.wait(..) 并在 5 秒后结束等待。

我尝试在 executeBlocking 中执行调用 WebClient 的代码,还尝试了 runOnContext 甚至尝试在线程中运行它,就像我对SenderWorker 但仍然是相同的结果.. WebClient 被阻塞,直到超时结束。

知道我在这里做错了什么以及如何让它工作吗?!

最佳答案

您可能需要考虑 vertx-unitvertx-junit5用于使用 Vert.x 测试异步代码。

除此之外,应该组合异步操作而不是旋转线程并等待倒计时锁存器。 Vert.x 提供了几个选项来做到这一点:

  • 回调链
  • future 的组成
  • RxJava(1 和 2)
  • Kotlin 协程
  • 类星体。

关于java - 使用 CountDownLatch 等待从 vertx WebClient 返回的 http 响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56019155/

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