问题标签 [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.
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 客户端请求中获取?
spring - Spring将请求范围的bean提升到子线程(HttpServletRequest)
我现在尝试了很多东西,但我似乎错过了一块拼图。这是故事:我有一个请求范围的 bean,它从 HttpServletRequest 读取一些 SessionContext。此属性在过滤器中设置。因此,当代码在正确的线程上运行时,这绝对可以正常工作。
现在我开始使用 java 8s 的新特性 CompletableFuture 并且在请求线程等待结果时,我有其中三个并行计算的特性。我想要做的是提升/移交/传播bean或请求,使其可用于从原始http线程产生的子线程。特别是我想从异步提供的 CompletableFuture 中的 HttpServletRequest 中获取 SessionContext。
我尝试的是这个(替换get的实现):
但这显然与请求范围的 bean 具有相同的结果。好吧,“getRequest”返回 null 而不是抛出异常。
作为第三种方法,我尝试了这个原始帖子:
我将 SessionContextProviderImpl 的范围设置为“simpleThreadScope”。不幸的是,这也不起作用,并引发了一个异常,即它在请求范围之外使用。
我正在使用的环境:泽西连同弹簧注射。
也许有人有一些想法?
问候
java - Java 8 中的 completableFuture 是否可以扩展到多核?
假设我有一个线程调用一堆返回 completablefuture 的方法,并说我将它们全部添加到一个列表中,最后我做了completablefutures.allof(list_size).join()
。现在列表中的未来是否可以扩展到多个核心?换句话说,未来是否安排到多个内核中以利用并行性?
java - Java CompletableFuture“参数”
我想异步调用一个方法,当它完成时,调用另一个函数。
我所做的是:
它工作!但我现在的问题是:我需要将 n 参数传递给 startProduction。
startProduction(long timer)
而且我不知道哪个是最好的方法/如何做到这一点。
谢谢。
java - 如何获得 Completeablefuture 的结果
在 Main 类中,我尝试使用 CompletableFuture 异步运行任务。如FMSMsgHandlerSupplier类的代码所示,它返回Double[]类型的数据
问题是,在 Main 类的 for 循环中,FMSMsgHandlerSupplier 被调用了 5 次,并假设每次迭代我都接收到数据类型 Double [] 的新值,如何在每次调用 FMSMsgHandlerSupplier 后得到计算结果班级?
主要:
}
FMSMsgHandlerSupplier:
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 库中的其他东西,可以更好地支持这个用例吗?
java - CompletableFuture 单个任务,可继续执行许多并行任务
我有以下代码:
英文:第一个任务foo
异步创建对象;然后我需要在它上面运行 N 个并行进程。
那么有没有更好的方法来做到这一点:
我不喜欢这样,因为一个线程在等待 N 个作业完成时被锁定。
java - 从同步方法调用创建 CompletableFuture
我想知道是否存在用于从同步方法调用创建 CompletableFuture 的单线。如果不是,为什么?
长版:
所需的简短版本(或种类):
java - CompletableFuture 的多个 thenAccept 块的执行顺序是什么
所以我有一个返回CompletableFuture
. 在返回之前,此方法会添加一个thenAccept
在完成后执行的块CompletableFuture
。
此方法的调用者还添加了另一个带有thenAccept
. 显然,这可以通过多个链接调用进行。
调用CompletionStage
返回的顺序是什么?thenAccept
是否保证是添加它们的顺序?如果不是,如何保证它们按添加顺序执行?
PS:我是根据我自己的经验CompletableFuture
和这篇文章问这个的
java-8 - CompletableFuture 是否有对应的本地上下文?
在过去,我们不得不ThreadLocal
让程序在请求路径中携带数据,因为所有请求处理都是在该线程上完成的,像 Logback 这样的东西使用它MDC.put("requestId", getNewRequestId());
然后 Scala 和函数式编程出现了,Future
s 也随之出现了Local.scala
(至少我知道 twitterFuture
有这个类)。 通过所有/等功能Future.scala
了解Local.scala
并传输上下文,这样我仍然可以做,然后在它经过许多线程后向下游发送,我仍然可以使用它访问它map
flatMap
Local.set("requestId", getNewRequestId());
Local.get(...)
Soooo,我的问题是在 Java 中,我可以用新的CompletableFuture
某处LocalContext
或某个对象(不确定名称)做同样的事情吗?这样,我可以修改 Logback MDC 上下文以将其存储在该上下文中而不是ThreadLocal
这样我不会丢失请求 id 和我的所有thenApply
日志thenAccept
,等等等等。仍然可以正常使用日志记录和-XrequestId
Logback 配置中的标志。
编辑:
举个例子。如果您有一个请求进来并且您正在使用 Log4j 或 Logback,您将在过滤器中设置MDC.put("requestId", requestId)
,然后在您的应用程序中,您将记录许多日志语句:
现在,在日志输出中它将显示:
这是使用一个技巧ThreadLocal
来实现这一点。在 Twitter,我们使用 Scala 和 ScalaFuture
中的 Twitter 以及一个Local.scala
类。 Local.scala
并且Future.scala
联系在一起,因为我们仍然可以实现上述场景,这非常好,我们所有的日志语句都可以记录请求 ID,因此开发人员永远不必记住记录请求 ID,您可以跟踪单个客户的请求响应周期用那个身份证。
我在 Java 中看不到这一点 :( 这很不幸,因为有很多用例。也许有一些我没有看到的东西?