问题标签 [completable-future]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
10191 浏览

asynchronous - 如何获得 CompletableFuture来自异步 Http 客户端请求?

Async Http Client 文档中,我看到了如何通过Future<Response>简单的异步 HTTP Get 请求获取 a ,例如:

但是,为了方便起见,我想得到一个CompletableFuture<T>代替,为此我可以应用一个将结果转换为其他内容的延续,例如将响应内容从 Json 反序列化为 Java 对象(例如SoccerSeason.java)。这就是我想做的:

根据Async Http Client 文档,唯一的方法是通过一个AsyncCompletionHandler<T>对象并使用一个 Promise。所以我为此建立了一个辅助方法

使用这个实用方法,我可以重写前面的示例:

有没有更好的方法CompletableFuture<T>从异步 Http 客户端请求中获取?

0 投票
2 回答
11684 浏览

spring - Spring将请求范围的bean提升到子线程(HttpServletRequest)

我现在尝试了很多东西,但我似乎错过了一块拼图。这是故事:我有一个请求范围的 bean,它从 HttpServletRequest 读取一些 SessionContext。此属性在过滤器中设置。因此,当代码在正确的线程上运行时,这绝对可以正常工作。

现在我开始使用 java 8s 的新特性 CompletableFuture 并且在请求线程等待结果时,我有其中三个并行计算的特性。我想要做的是提升/移交/传播bean或请求,使其可用于从原始http线程产生的子线程。特别是我想从异步提供的 CompletableFuture 中的 HttpServletRequest 中获取 SessionContext。

我尝试的是这个(替换get的实现):

但这显然与请求范围的 bean 具有相同的结果。好吧,“getRequest”返回 null 而不是抛出异常。

作为第三种方法,我尝试了这个原始帖子

我将 SessionContextProviderImpl 的范围设置为“simpleThreadScope”。不幸的是,这也不起作用,并引发了一个异常,即它在请求范围之外使用。

我正在使用的环境:泽西连同弹簧注射。

也许有人有一些想法?

问候

0 投票
3 回答
14099 浏览

java - Java 8 中的 completableFuture 是否可以扩展到多核?

假设我有一个线程调用一堆返回 completablefuture 的方法,并说我将它们全部添加到一个列表中,最后我做了completablefutures.allof(list_size).join()。现在列表中的未来是否可以扩展到多个核心?换句话说,未来是否安排到多个内核中以利用并行性?

0 投票
0 回答
1052 浏览

java - Java CompletableFuture“参数”

我想异步调用一个方法,当它完成时,调用另一个函数。

我所做的是:

它工作!但我现在的问题是:我需要将 n 参数传递给 startProduction。

startProduction(long timer)

而且我不知道哪个是最好的方法/如何做到这一点。

谢谢。

0 投票
1 回答
406 浏览

java - 如何获得 Completeablefuture 的结果

在 Main 类中,我尝试使用 CompletableFuture 异步运行任务。如FMSMsgHandlerSupplier类的代码所示,它返回Double[]类型的数据

问题是,在 Main 类的 for 循环中,FMSMsgHandlerSupplier 被调用了 5 次,并假设每次迭代我都接收到数据类型 Double [] 的新值,如何在每次调用 FMSMsgHandlerSupplier 后得到计算结果班级?

主要

}

FMSMsgHandlerSupplier

0 投票
2 回答
14971 浏览

java - 传递给 CompletableFuture.exceptionalally() 的异常处理程序是否必须返回有意义的值?

我习惯了这种ListenableFuture模式,带有onSuccess()onFailure()回调,例如

似乎 Java 8CompletableFuture旨在处理或多或少相同的用例。天真地,我可以开始将上面的示例翻译为:

这肯定没有ListenableFuture版本那么冗长,而且看起来很有希望。

但是,它不会编译,因为exceptionally()不需要 a Consumer<Throwable>,它需要 a Function<Throwable, ? extends T>-- 在这种情况下是 a Function<Throwable, ? extends String>

这意味着我不能只记录错误,我必须想出一个String在错误情况下返回的值,而在错误情况下没有任何有意义的String值可以返回。我可以 return null,只是为了让代码编译:

但这又开始变得冗长了,而且除了冗长之外,我不喜欢null让它四处飘荡——这表明有人可能会尝试检索或捕获该值,并且在很久以后的某个时候我可能会有一个意想不到的NullPointerException.

如果exceptionally()采取了Function<Throwable, Supplier<T>>我至少可以做这样的事情 -

——但事实并非如此。

exceptionally()永远不应该产生有效值时,正确的做法是什么?有什么我可以做的CompletableFuture,或者新的 Java 8 库中的其他东西,可以更好地支持这个用例吗?

0 投票
2 回答
5814 浏览

java - CompletableFuture 单个任务,可继续执行许多并行任务

我有以下代码:

英文:第一个任务foo异步创建对象;然后我需要在它上面运行 N 个并行进程。

那么有没有更好的方法来做到这一点:

我不喜欢这样,因为一个线程在等待 N 个作业完成时被锁定。

0 投票
2 回答
12697 浏览

java - 从同步方法调用创建 CompletableFuture

我想知道是否存在用于从同步方法调用创建 CompletableFuture 的单线。如果不是,为什么?

长版:

所需的简短版本(或种类):

0 投票
1 回答
2375 浏览

java - CompletableFuture 的多个 thenAccept 块的执行顺序是什么

所以我有一个返回CompletableFuture. 在返回之前,此方法会添加一个thenAccept在完成后执行的块CompletableFuture

此方法的调用者还添加了另一个带有thenAccept. 显然,这可以通过多个链接调用进行。

调用CompletionStage返回的顺序是什么?thenAccept是否保证是添加它们的顺序?如果不是,如何保证它们按添加顺序执行?

PS:我是根据我自己的经验CompletableFuture和这篇文章问这个的

0 投票
2 回答
3883 浏览

java-8 - CompletableFuture 是否有对应的本地上下文?

在过去,我们不得不ThreadLocal让程序在请求路径中携带数据,因为所有请求处理都是在该线程上完成的,像 Logback 这样的东西使用它MDC.put("requestId", getNewRequestId());

然后 Scala 和函数式编程出现了,Futures 也随之出现了Local.scala(至少我知道 twitterFuture有这个类)。 通过所有/等功能Future.scala了解Local.scala并传输上下文,这样我仍然可以做,然后在它经过许多线程后向下游发送,我仍然可以使用它访问它mapflatMapLocal.set("requestId", getNewRequestId());Local.get(...)

Soooo,我的问题是在 Java 中,我可以用新的CompletableFuture某处LocalContext或某个对象(不确定名称)做同样的事情吗?这样,我可以修改 Logback MDC 上下文以将其存储在该上下文中而不是ThreadLocal这样我不会丢失请求 id 和我的所有thenApply日​​志thenAccept,等等等等。仍然可以正常使用日志记录和-XrequestIdLogback 配置中的标志。

编辑:

举个例子。如果您有一个请求进来并且您正在使用 Log4j 或 Logback,您将在过滤器中设置MDC.put("requestId", requestId),然后在您的应用程序中,您将记录许多日志语句:

现在,在日志输出中它将显示:

这是使用一个技巧ThreadLocal来实现这一点。在 Twitter,我们使用 Scala 和 ScalaFuture中的 Twitter 以及一个Local.scala类。 Local.scala并且Future.scala联系在一起,因为我们仍然可以实现上述场景,这非常好,我们所有的日志语句都可以记录请求 ID,因此开发人员永远不必记住记录请求 ID,您可以跟踪单个客户的请求响应周期用那个身份证。

我在 Java 中看不到这一点 :( 这很不幸,因为有很多用例。也许有一些我没有看到的东西?