2

私は現在、Web サービス インターフェイスを公開する Java Web アプリケーションを開発しています。私の Web サービスのクラス定義は次のとおりです。

@WebService()
public class ETL_WS {
    private String TOMCAT_TEMP_DIR;
    private final int BUFFER_SIZE = 10000000;
    private ConcurrentHashMap myMap;
    private String dbTable = "user_preferences";

    public ETL_WS() {
        Context context = null;
        try {
            context = (Context) new InitialContext().lookup("java:comp/env");
            this.TOMCAT_TEMP_DIR = (String) context.lookup("FILE_UPLOAD_TEMP_DIR");
        }catch(NamingException e) {
        System.err.println(e.getMessage());
    }

    public long getCouponMapCreationTime() {
        return couponMap.getCreationTime();
    }

}

同じ ConcurrentHashMap myMap インスタンスを表示するにはすべてのリクエストが必要であるため、Web サービス オブジェクトの有効期間を知りたいと考えています。具体的には、最初のクライアント要求で初期化されることを知っています。しかし、すべてのクライアントが同じmyMap オブジェクトのインスタンスを見るのでしょうか? そうでない場合、これはどのように可能ですか?

お時間をいただきありがとうございます。

4

2 に答える 2

3

簡単な答え: いいえ、アプリケーション サーバーによって作成されるこのクラスのインスタンスの数を制御することはできません。唯一確かなことは、最初のリクエストの前に少なくとも 1 つのオブジェクトがインスタンス化されることです。通常、アプリケーション サーバーはワーカー スレッドごとに 1 つのインスタンスを作成します。つまり、同じクラスのオブジェクトが数十個作成されます。

ただし、これらのインスタンス間で共通のデータを持つことは可能です。最も簡単な解決策は、staticメンバー変数を使用することです。静的メンバーは、クラスに属しているため、すべてのオブジェクト間で一意であることが保証されています。

@WebService()
public class ETL_WS {
    // ...
    private static ConcurrentHashMap myMap;
    // ...
}
于 2012-06-19T12:58:05.193 に答える
1

私が考えることができる 1 つの方法は、Web サービスの背後にあるシングルトンでこれを維持することです。この方法では、WS ライフサイクルは実際には問題になりません (これはシングルトンですが、WS インターフェイスの目的は、単に要求を取得することです。その背後にあるアプリケーションのコア ロジックをサービスにカプセル化することをお勧めします)。

于 2012-06-19T12:55:22.707 に答える