問題タブ [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 を取得するにはどうすればよいですかAsync Http Client リクエストから?

Async Http Client documentationでは、非同期 HTTP Get リクエストの結果としてa を取得する方法を確認できますFuture<Response>。たとえば、次のようにします。

ただし、便宜上、代わりに を取得したいと思いCompletableFuture<T>ます。そのために、結果を別のものに変換する継続を適用できます。たとえば、Json からの応答コンテンツを Java オブジェクト (例: SoccerSeason.java ) に逆シリアル化します。これは私がやりたいことです:

Async Http Client documentationによると、これを行う唯一の方法は、AsyncCompletionHandler<T>オブジェクトを介して promise を使用することです。だから私はその目的のために補助的な方法を構築しました:

このユーティリティ メソッドを使用すると、前の例を次のように書き直すことができます。

CompletableFuture<T>Async Http Client リクエストから取得するより良い方法はありますか?

0 投票する
2 に答える
11684 参照

spring - リクエスト スコープ Bean を子スレッドに昇格する Spring (HttpServletRequest)

私は今、多くのことを試しましたが、パズルのピースを見逃しているようです. ストーリーは次のとおりです。HttpServletRequest から SessionContext を読み取るリクエスト スコープ Bean があります。この属性はフィルターで設定されます。したがって、コードが正しいスレッドで実行されている間、これはまったく問題なく機能します。

今、私は Java 8s の新機能 CompletableFuture を使い始めました。リクエスト スレッドが結果を待っている間、これらの機能の 3 つを並行して計算しています。私がやりたいことは、元の http スレッドから生成された子スレッドで使用できるように、Bean または要求を昇格/引き渡し/伝播することです。特に、非同期で提供される CompletableFuture 内から HttpServletRequest から SessionContext を取得したいと考えています。

私が試したのはこれです(getの実装を置き換えました):

しかし、これは明らかにリクエスト スコープ Bean と同じ結果になります。「getRequest」は例外がスローされる代わりに null を返します。

3番目のアプローチとして、私はこの元の投稿を試しました:

そして、SessionContextProviderImpl のスコープを「simpleThreadScope」に設定しました。残念ながら、これも機能せず、リクエスト スコープ外で使用されているという例外がスローされました。

私が使用している環境:春の注入と一緒にジャージ。

多分誰かが何か考えを持っていますか?

よろしく

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.exceptionally() に渡される例外ハンドラーは、意味のある値を返す必要がありますか?

私はとコールバックListenableFutureを使ったパターンに慣れています。onSuccess()onFailure()

Java 8CompletableFutureは、多かれ少なかれ同じユースケースを処理することを意図しているようです。単純に、上記の例を次のように翻訳し始めることができます。

これは確かにバージョンよりも冗長ではなく、ListenableFuture非常に有望に見えます。

ただし、 をとらないため、コンパイルされませexceptionally()ん。この場合は.Consumer<Throwable>Function<Throwable, ? extends T>Function<Throwable, ? extends String>

これは、単にエラーをログに記録することはできず、エラーの場合に返す値を考え出す必要がStringあり、エラーの場合に返す意味のある値がないことを意味Stringします。nullコードをコンパイルするためだけに、を返すことができます。

しかし、これは再び冗長になり始めており、冗長性を超えて、それが浮かんでいるのは好きではありません.null誰かがその値を取得またはキャプチャしようとする可能性があり、かなり後の時点で予期しNullPointerExceptionない

もし私が少なくともこのようなことをexceptionally()することができたなら -Function<Throwable, Supplier<T>>

--しかし、そうではありません。

exceptionally()が有効な値を生成してはならない場合、どうするのが正しいでしょうか? このユースケースをより適切にサポートするために、私ができることCompletableFuture、または新しい Java 8 ライブラリーで他にできることはありますか?

0 投票する
2 に答える
12697 参照

java - sync メソッド呼び出しから CompletableFuture を作成する

synchron メソッド呼び出しから CompletableFuture を作成するためのワンライナーが存在するかどうかを知りたいです。いいえの場合、なぜですか?

長いバージョン:

短い希望のバージョン (または種類):

0 投票する
1 に答える
2375 参照

java - CompletableFuture の複数の thenAccept ブロックが実行される順序は?

だから私はを返すメソッドを持っていますCompletableFuture。戻る前に、このメソッドは完了thenAccept後に実行されるブロックを追加CompletableFutureします。

このメソッドの呼び出し元は、別のブロックも追加しthenAcceptます。明らかに、これは複数の連鎖呼び出しで続行できます。

実行された呼び出しCompletionStageによって返される順序は? thenAcceptそれらが追加された順序であることが保証されていますか? そうでない場合、それらが追加された順序で実行されることをどのように保証できますか?

PS: 私はCompletableFuture、この記事に関する私自身の経験に基づいて、これを求めています。

0 投票する
2 に答える
3883 参照

java-8 - CompletableFuture には対応する Local コンテキストがありますか?

昔はThreadLocal、すべてのリクエスト処理がそのスレッドで行われ、Logback のようなものがこれを使用していたため、プログラムはリクエスト パスとともにデータを運ぶ必要がありましたMDC.put("requestId", getNewRequestId());

その後、Scala と関数型プログラミングが登場し、Futureが登場しましたLocal.scala(少なくとも twitterFutureにこのクラスがあることは知っています)。 /などのすべての機能を介してコンテキストをFuture.scala認識して転送し、多くのスレッドを通過した後でもダウンストリームにアクセスできるようにします。Local.scalamapflatMapLocal.set("requestId", getNewRequestId());Local.get(...)

CompletableFutureすっごく、私の質問はJavaです。新しいどこかLocalContextまたはいくつかのオブジェクト(名前がわからない)で同じことを行うことができますThreadLocalか?リクエストIDとthenApply、、などのすべてのログを失わないこと.Logback構成thenAcceptのロギングと-XrequestIdフラグで問題なく動作します。

編集:

例として。リクエストが来て、Log4j または Logback を使用している場合は、フィルターで設定MDC.put("requestId", requestId)し、アプリで次の行に多くのログ ステートメントを記録します。

これで、ログ出力に次のように表示されます。

これは、これを達成するために のトリックを使用していThreadLocalます。Twitter では、クラス Futureと共に Scala と Scala のTwitter を使用します。上記のシナリオを実現できるという点で 1 つに結び付けられていますが、これは非常に優れており、すべてのログ ステートメントでリクエスト ID をログに記録できるため、開発者はリクエスト ID をログに記録することを覚えておく必要がなく、単一の顧客のリクエスト応答サイクルを追跡できます。そのIDで。Local.scalaLocal.scalaFuture.scala

これはJavaでは見られません:(そのための多くのユースケースがあるため、これは非常に残念です.おそらく私が見ていないものがありますか?