問題タブ [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 を取得するにはどうすればよいですか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 リクエストから取得するより良い方法はありますか?
spring - リクエスト スコープ Bean を子スレッドに昇格する Spring (HttpServletRequest)
私は今、多くのことを試しましたが、パズルのピースを見逃しているようです. ストーリーは次のとおりです。HttpServletRequest から SessionContext を読み取るリクエスト スコープ Bean があります。この属性はフィルターで設定されます。したがって、コードが正しいスレッドで実行されている間、これはまったく問題なく機能します。
今、私は Java 8s の新機能 CompletableFuture を使い始めました。リクエスト スレッドが結果を待っている間、これらの機能の 3 つを並行して計算しています。私がやりたいことは、元の http スレッドから生成された子スレッドで使用できるように、Bean または要求を昇格/引き渡し/伝播することです。特に、非同期で提供される CompletableFuture 内から HttpServletRequest から SessionContext を取得したいと考えています。
私が試したのはこれです(getの実装を置き換えました):
しかし、これは明らかにリクエスト スコープ Bean と同じ結果になります。「getRequest」は例外がスローされる代わりに null を返します。
3番目のアプローチとして、私はこの元の投稿を試しました:
そして、SessionContextProviderImpl のスコープを「simpleThreadScope」に設定しました。残念ながら、これも機能せず、リクエスト スコープ外で使用されているという例外がスローされました。
私が使用している環境:春の注入と一緒にジャージ。
多分誰かが何か考えを持っていますか?
よろしく
java - Java CompletableFuture "パラメータ"
あるメソッドを非同期で呼び出し、終了したら他の関数を呼び出したい。
私がしたことは次のとおりです。
そしてそれはうまくいきます!しかし、私の問題は次のとおりです。 n パラメータを startProduction に渡す必要があります。
startProduction(long timer)
そして、どれが最善の方法か/どのようにそれを行うのかわかりません。
ありがとう。
java - Completeablefuture の結果を取得する方法
Main クラスでは、CompletableFuture を使用して非同期にタスクを実行しようとしています。FMSMsgHandlerSupplier クラスのコードに示すように、Double[] 型のデータを返します。
問題は、Main クラスの for ループで FMSMsgHandlerSupplier が 5 回呼び出され、反復ごとにデータ型 Double[] の新しい値を受け取っていると仮定して、FMSMsgHandlerSupplier への各呼び出し後に計算された結果を取得するにはどうすればよいかということです。クラス?
メイン:
}
FMSMsgHandlerSupplier :
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 ライブラリーで他にできることはありますか?
java - sync メソッド呼び出しから CompletableFuture を作成する
synchron メソッド呼び出しから CompletableFuture を作成するためのワンライナーが存在するかどうかを知りたいです。いいえの場合、なぜですか?
長いバージョン:
短い希望のバージョン (または種類):
java - CompletableFuture の複数の thenAccept ブロックが実行される順序は?
だから私はを返すメソッドを持っていますCompletableFuture
。戻る前に、このメソッドは完了thenAccept
後に実行されるブロックを追加CompletableFuture
します。
このメソッドの呼び出し元は、別のブロックも追加しthenAccept
ます。明らかに、これは複数の連鎖呼び出しで続行できます。
実行された呼び出しCompletionStage
によって返される順序は? thenAccept
それらが追加された順序であることが保証されていますか? そうでない場合、それらが追加された順序で実行されることをどのように保証できますか?
PS: 私はCompletableFuture
、この記事に関する私自身の経験に基づいて、これを求めています。
java-8 - CompletableFuture には対応する Local コンテキストがありますか?
昔はThreadLocal
、すべてのリクエスト処理がそのスレッドで行われ、Logback のようなものがこれを使用していたため、プログラムはリクエスト パスとともにデータを運ぶ必要がありましたMDC.put("requestId", getNewRequestId());
その後、Scala と関数型プログラミングが登場し、Future
が登場しましたLocal.scala
(少なくとも twitterFuture
にこのクラスがあることは知っています)。 /などのすべての機能を介してコンテキストをFuture.scala
認識して転送し、多くのスレッドを通過した後でもダウンストリームにアクセスできるようにします。Local.scala
map
flatMap
Local.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.scala
Local.scala
Future.scala
これはJavaでは見られません:(そのための多くのユースケースがあるため、これは非常に残念です.おそらく私が見ていないものがありますか?