java - 以 rx 方式与 Jersey 客户端合作

标签 java jersey java-8 nio reactive-programming

议程:我想异步获取http响应,然后以同步方式使用它们。 我使用 Jersey 客户端和 jersey-rx-client-java8。 这是我的代码:

ExecutorService executorService = Executors.newSingleThreadExecutor();
RxClient<RxCompletionStageInvoker> client = Rx.newClient(RxCompletionStageInvoker.class, executorService);

Stream<String> urls_stream = Stream.of("stackoverflow.com", "stackoverflow.com");
urls_stream.map(url -> {
    return client
            .target(url)
            .request()
            .rx()
            .get()
            .whenComplete((response, throwable) -> {
                // this should be executed by 1 thread
                out.println(response.readEntity(String.class));
                if (null != throwable) throwable.printStackTrace();
            })
            .toCompletableFuture();
})
// Wait completion
        .collect(Collectors.toList()).forEach(list -> {
    CompletableFuture.allOf(list).join();
});

我有另一个代码,这个示例比第一个示例运行得更快。

String[] url_str = { ... };
Client client = ClientBuilder.newClient(config);
CountDownLatch cdl = new CountDownLatch(urls.length);
for (String url_str : urls) {
    Future<Response> response = client.target(url_str).request().async().get(new InvocationCallback<Response>() {
        @Override
        public void completed(Response response) {
            out.println(response.readEntity(String.class));
            cdl.countDown();
        }

        @Override
        public void failed(Throwable t) {
            t.printStackTrace();
            cdl.countDown();
        }
    });
}
cdl.await();

我想证明第一个示例运行得更快(但我不想增加池中的线程)。

最佳答案

据我了解,即使在异步模式下,Jersey 也为每个连接使用一个线程。只有一种可能的解决方案是增加池中的线程。

关于java - 以 rx 方式与 Jersey 客户端合作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39469435/

相关文章:

java - 从常量构建静态 map

java-8 - 更新 Fuse 以获得 TLS v1.3

Java 模式多行

java.lang.ClassNotFoundException : com. google.cloud.sql.mysql.SocketFactory

java - 乐观缓存并发设计模式

java - 文本字段描述 RichFaces

java - 如何从谷歌驱动器直接下载链接获取文件扩展名?

java - 如何使用 Java 在 Eclipse 中使用 Web 服务(JAX - RS)从数据库中检索数据

java - 带 Protocol Buffers 的 JAX-RS 教程应用程序

java - 如何让 Eclipse 使用 JDK8 编译项目?