3

Google AppEngineでホストされているオープンソースのCMSであるVosaoCMSのコードを閲覧していて(これは素晴らしいアイデアだと思います)、CurrentUserクラス内で次のコードを見つけました。

/**
 * Current user session value cache class. Due to GAE single-threaded nature
 * we can cache currently logged in user in static property. Which we set in 
 * authentication filter.
 */
public class CurrentUser {

        private static UserEntity user;

        public static UserEntity getInstance2() {
                return user;
        }

        public static void setInstance2(UserEntity aUser) {
                user = aUser;
        }
}

私はGAEを使ったことがありませんが、これは私には本当に奇妙に聞こえます。

  • GAEは本当に「シングルスレッド」ですか?GAEを使用する場合、リクエストスコープのデータを静的フィールド内に保存しても安全ですか?

  • これは、JVMインスタンスごとに、他のすべてのリクエストが待機している間、一度に1つのHTTPリクエストのみが実行されることを意味しますか?

  • これは一般的なGAEイディオムですか?そうでない場合、リクエストの期間中、そのようなUserEntityを保存するのに最適なGAEイディオムは何でしょうか?Spring Securityのように、ここでThreadLocalを使用するべきではありませんか?または、ある種のスコープ付きBean(依存性注入コンテナーによって管理される)ですか?

4

2 に答える 2

4

現在、AppEngineのJavaランタイムとPythonランタイムはどちらもシングルスレッドです。これは、JVMごとに1つのHTTP要求のみが実行されることを意味しますが、複数の着信要求を処理するために複数のJVMが同時に開始されることを意味します。

ただし、これは将来いつでも変更される可能性があります。Javaサーブレットの仕様ではマルチスレッドが許可されています。結果として、間違いなくThreadLocalを使用する必要があります。

于 2010-10-27T10:16:29.167 に答える
4

GAEは本当に「シングルスレッド」ですか?GAEを使用する場合、リクエストスコープのデータを静的フィールド内に保存しても安全ですか?

以前は(1.4.3まで)そのようでしたが、デフォルトでは現在も使用されています。

これで、アプリがスレッドセーフであることを指定できます。そうすると、同じJVM/サーブレットへの同時リクエストを受信します。

これは、JVMインスタンスごとに、他のすべてのリクエストが待機している間、一度に1つのHTTPリクエストのみが実行されることを意味しますか?

他のリクエストの場合は、おそらく別のJVMを取得します。しかし、それはあなたのコントロールの外です。彼らはただ待つこともできます。

于 2011-03-31T04:13:01.790 に答える