1. ホーム
  2. java

[解決済み] ステートレスおよびステートフルなEnterprise Java Beans

2023-01-05 05:01:26

質問

Java EE 6のチュートリアルを進めていて、ステートレスおよびステートフルセッションビーンとの違いを理解しようとしています。ステートレス・セッションBeanがメソッド呼び出しの間に状態を保持しないのであれば、なぜ私のプログラムはそのように動作するのでしょうか。

package mybeans;

import javax.ejb.LocalBean;
import javax.ejb.Stateless;

@LocalBean
@Stateless
public class MyBean {

    private int number = 0;

    public int getNumber() {
        return number;
    }

    public void increment() {
        this.number++;
    }
}

クライアント

import java.io.IOException;
import javax.ejb.EJB;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.WebServlet;
import mybeans.MyBean;
import java.io.PrintWriter;

@WebServlet(name = "ServletClient", urlPatterns = { "/ServletClient" })
public class ServletClient extends HttpServlet {
    private static final long serialVersionUID = 1L;

    @EJB
    MyBean mybean;

    protected void doGet(HttpServletRequest request,
            HttpServletResponse response) throws ServletException, IOException {

        PrintWriter out = response.getWriter();
        mybean.increment();
        out.println(mybean.getNumber());
    }

}

私はgetNumberが毎回0を返すと思っていたのですが、1を返しており、ブラウザでサーブレットを再読み込みするともっと増えます。問題は、ステートレスセッションビーンがどのように動作するかについての私の理解であり、もちろんライブラリやアプリケーションサーバーの問題ではありません。誰か、ステートフルに変更したときに異なる動作をするステートレスセッションビーンの簡単なハローワールドタイプの例を教えてください。

どのように解決するのですか?

重要な違いは、プライベートメンバー変数ではなく、状態を特定のユーザーに関連付けることです("ショッピングカート"を考えてみてください)。

ステートフルセッションBeanのステートフルな部分は、サーブレットにおけるセッションのようなものです。 ステートフルセッションビーンによって、ウェブクライアントがない場合でも、アプリがそのセッションを保持することができます。 アプリサーバーがオブジェクトプールからステートレスセッションビーンを取り出すとき、それは特定のユーザーと関連付けられていないため、任意のリクエストを満たすために使用できることがわかります。

ステートフルセッションビーンは、最初にそれを取得したユーザーに提供されなければなりません。なぜなら、彼らのショッピングカートの情報は彼らだけに知られていなければならないからです。 アプリサーバーは、これがそうであることを保証します。 もしあなたが買い物を始め、私が来たときにアプリサーバーがあなたのステートフルセッションビーンを渡してくれたら、あなたのアプリがどれだけ人気が出るか想像してみてください!

つまり、あなたのプライベートデータメンバーは確かに "state" ですが、それは "shopping cart" ではないということです。 インクリメントされた変数が特定のユーザーと関連付けられるように、あなたの (非常に良い) 例をやり直してみてください。 それをインクリメントして、新しいユーザーを作成し、彼らがまだインクリメントされた値を見ることができるかどうかを確認します。 正しく行われた場合、すべてのユーザーは自分のバージョンのカウンターだけを見ることができるはずです。