当前位置: 首页 > 知识库问答 >
问题:

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

呼延晋
2023-03-14
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();
                            }
                        });
    }
}
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);
        }
    }
}
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);
        }
    }
}

你知道我在这里做错了什么吗?我怎么能让它工作。?!

共有1个答案

濮阳鸿祯
2023-03-14

您可能希望考虑使用Vert.x测试异步代码的vertx-unit或vertx-junit5。

除此之外,应该组成异步操作,而不是旋转线程和等待倒计时锁存器。Vert.x提供了几种实现此目的的选项:

  • 回调链接
  • 未来组合
  • RXJava(1和2)
  • Kotlin Coroutines
  • 类星体。
 类似资料:
  • 我有一些文件要上传,有些文件失败了,因为帖子是异步的,而不是同步的。 我正在尝试将此调用作为同步调用。 我想等回应。 如何将此调用设为同步调用? 任何帮助感谢!

  • 是否可以在不等待响应的情况下发送HTTP请求? 我在做一个物联网项目,需要记录传感器的数据。在每一个设置中,都有许多传感器,一个中央协调器(主要由Raspberry Pi实现)从传感器收集数据,并通过Internet将数据发送到服务器。 提前感谢! 编辑:传感器是无线的,但他们使用的技术在发送到协调器时很少(或没有)延迟。此协调器必须通过Internet发送数据。但是,假设互联网连接不好。因为这将

  • 问题内容: 当使用简单的回调(例如下面的示例)时: 如何更改功能以使用异步/等待?具体来说,假设“ someEvent”被保证只能被调用一次,那么我希望函数测试是一个异步函数,该异步函数在执行回调之前不会返回,例如: 问题答案: 不是魔术。异步函数是可以为您解开Promises的函数,因此您需要返回一个Promise才能起作用。像这样: 然后 但这也是一个谎言,因为异步函数也返回Promises本

  • 使用以下示例中的简单回调时: 如何将函数更改为使用异步/等待?具体地说,假设某个事件保证被调用一次并且只有一次,我希望函数测试是一个异步函数,直到执行回调才返回,例如:

  • 我有一个windows服务,我从另一个开发人员继承,它运行非常慢,并有许多对eBay API的缓慢调用。我希望在没有太多重构的情况下加快它。 我刚刚开始研究使用C#Async/Await来尝试让这些缓慢的调用运行异步。以下是我试图实现的目标: 如何获取返回的类型以便使用它们?我尝试使用,但它只有属性可用。

  • 我正在使用Spring Webflow R2DBC将一些数据插入数据库。 要求提供数据- 控制器 服务 道 主要问题是我不知道如何让它等待所有结果返回并添加到最终