RestTemplateはスレッドセーフですか?
質問
スプリングは
RestTemplate
はスレッドセーフですか?それは
-
は
RestTemplate
で、複数の接続が安全に共有できるストラテジーオブジェクトです。 または -
は
RestTemplate
接続オブジェクト (データベース接続のようなもの) で、使用中は共有できず、 接続ごとに新たに作成するか、プーリングする必要があります。
どのように解決するのですか?
RestTemplate
はスレッドセーフです。
(強調)。
概念的には、非常によく似た
JdbcTemplate
,JmsTemplate
といった、Spring Frameworkや他のポートフォリオプロジェクトで見られる様々なテンプレートがあります。これは、例えばRestTemplate
は一度構築されるとスレッドセーフになります
のオブジェクトは
RestTemplate
クラスのオブジェクトは、HTTP を処理するためにその状態情報を一切変更しません。このクラスは、接続オブジェクトのようなものではなく、Strategy デザインパターンのインスタンスなのです。状態情報がないため、異なるスレッドが
RestTemplate
オブジェクトを共有しても、異なるスレッドが状態情報を破損したり、競争したりする可能性はありません。これが、スレッドがこれらのオブジェクトを共有することが可能である理由です。
を調べると
のソースコードを調べると
RestTemplate
を使っていないことがわかるでしょう。
synchronized
メソッドや
volatile
フィールドを使用して、オブジェクトの構築後にスレッドセーフを提供します。つまり、それは
ではなく
を修正するのは安全ではありません。
RestTemplate
オブジェクトを修正するのは安全ではありません。特に、メッセージコンバータを追加することは安全ではありません。
メッセージコンバータのリストを提供するためには、以下のいずれかを行う必要があります。
-
を使用する。
RestTemplate(List<HttpMessageConverter<?>> messageConverters)
のコンストラクタを使用します。の内部リストとしてmessageConverters
はfinal
は、この はメッセージコンバータのリストを安全に公開します。 . -
を使用します。
setMessageConverters(List<HttpMessageConverter<?>> messageConverters)
ミューテーター と では 安全に公開する 変更されたRestTemplate
オブジェクトを作成します。Spring Beanの定義で<property name="messageConverters"><list>...
がこれを行うので、ビーン はコンテナをセットアップするスレッドによって安全に発行されるからです。 を安全に発行するからです。 -
使用方法
List.add
によって返される参照にgetMessageConverters()
で返された参照にアクセスし、変更されたRestTemplate
オブジェクトを安全に公開します。しかしRestTemplate
のドキュメントには、メッセージコンバータのリストを変更するために使用できる参照を返すとは明示的に記載されていません。現在の実装ではそうなっていますが、もしかしたら実装を変更してCollections.unmodifiableList
またはリストのコピーを返すように実装が変更されるかもしれない。だから、このように変更しない方がいいかもしれない。
最初のケースは、オブジェクトを構築するときにメッセージコンバータを設定する唯一の手段であることに注意してください、したがってそれは です。 一旦構築されるとスレッドセーフであると言うのは正しいことです。
このクラスはSpring Frameworkの一部なので、ほとんどすべての実用的なケースでは、このクラスのオブジェクトはSpring Application Contextの一部として、最初の(コンストラクタによる依存性注入)または2番目の(セッタによる依存性注入)メソッドを使用してセットアップされます。
関連
-
undefined[sonar] sonar:デフォルトのスキャンルール
-
セミコロン期待値エラー解決
-
switch case文のcaseの後の列挙定数は列挙型なし
-
[解決済み] Javaにおける "implements Runnable "と "extends Thread "の違いについて
-
[解決済み] Java 8 の並列ストリームにおけるカスタムスレッドプール
-
[解決済み] Spring RestTemplateのパラメータ付きGET
-
[解決済み] Spring RestTemplate - リクエスト/レスポンスの完全なデバッグ/ロギングを有効にするには?
-
[解決済み】Queue.Queueとcollections.dequeの比較
-
[解決済み】リエントラント関数とは一体何でしょうか?
-
[解決済み] 何がメソッドをスレッドセーフにするのか?そのルールは?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
Solve モジュールのビルドに失敗しました。Error: ENOENT: no such file or directory エラー
-
ブートレイヤーの初期化中にエラーが発生しました java.lang.module.FindException: モジュールが見つかりません
-
名前 'XXX' を持つ Bean の作成に失敗しました。自動依存関係の注入に失敗しました 解決方法
-
無効なメソッド宣言
-
-bash: java: コマンドが見つからない 解決方法
-
SpringBoot 起動エラー java.nio.charset.MalformedInputException: 入力長 = 2 解決
-
java send https request prompt java.security.cert.について。
-
JDK8 の Optional.of と Optional.ofNullable メソッドの違いと使い方を説明する。
-
Web Project JavaでPropertiesファイルを読み込むと、「指定されたファイルがシステムで見つかりません」というソリューションが表示されます。
-
java 365*1000*60*60*24 計算問題