0

私がそれを正しく理解していれば、 @Stateful Bean が状態を保存します。クライアントが再度リクエストを行うと、同じインスタンスに戻ります。したがって、@Stateless では不可能なクラス属性を保存することができます。ここの別のスレッドで、誰かが「これは従来の Java インスタンスのようなもので、すべてのインジェクションがこの Bean の独自のインスタンスを取得します」と書いています。

しかし、 @Stateful Bean へのリクエストのマッピングがどのように機能するのかわかりません。機能するにはどうすればよいですか? この質問は、次の 2 つのケースに当てはまります。

  1. クライアント ソフトウェアの Web サービスで @Stateful を呼び出します。それは私がそれと一緒に送らなければならないIDですか?しかし、ID とは何であり、コンテナーはこれが識別属性であることをどのように認識し、正しい @Stateful Bean にルーティングするのでしょうか?
  2. @Stateless Bean から @Stateful を呼び出します。例として、クライアントが最初に @Stateless Bean を呼び出し、@Stateful Bean にリダイレクトする場合。

この質問は、コンテナ/サーバー ソフトウェアの技術的なプロセスに関するものではなく、開発時の具体的な作業に関するものです。ご支援いただきありがとうございます。

ご挨拶

4

1 に答える 1

0

残念ながら、それは Web サービスの仕組みではありません。ステートフル Bean は、ステートレス Bean に対してのみステートフルです。そして、クライアントのためではありません。そして、それはいくつかの理由で非常に危険です:

- ステートレス Bean は、呼び出しの状態をステートフル参照に保存します。ただし、ステートレス Bean の次の呼び出しは、別のコンテキストまたは別のクライアントによって発生する可能性があります。

- ステートフル Bean は、ステートレス Bean がまだ生きているかプール内にある間にコンテナーによって破棄される可能性があります。

ステートフル Bean は、リモート呼び出しまたは Web アプリケーションで使用できますが、Web サービスのコンテキストでは使用できません。

Web サービスは、アプリケーションの状態のない定義ごとです。Java EE-Servlet はリクエストをリッスンし、インスタンスのプールから 1 つのステートレス Bean 実装を呼び出します。

ステートフル Web サービスを本当に実装したい場合は、自分で実装する必要があります。次の例は、Java EE 6 コンテナーで機能します。

///  Client depended values(your statefull bean)
public class SessionValues {
   private final List<String> values = new ArrayList<String>(); 

   public void addValue(String s){
        values.add(s);
    }

    public List<String> loadValues(){
        return Collections.unmodifiableList(values);
    }
}

セッションをシングルトン(独自のプール)に保存できます

 @Singleton
 @Startup
 public class StatefullSingleton {
   private final Map<String, SessionValues> sessions = new Hashtable<String, SessionValues>();

    @Lock(LockType.READ)
    public void addValue(String sessionId, String value) {
      if (!sessions.containsKey(sessionId))
          sessions.put(sessionId, new SessionValues());
      SessionValues p = sessions.get(sessionId);
      p.addValue(value);
  }

  @Lock(LockType.READ)
  public List<String> loadValues(String sessionId) {
    if (sessions.containsKey(sessionId))
        return sessions.get(sessionId).loadValues();
    else
        return new ArrayList<String>();
  }
}

ステートレス Web サービス Bean にシングルトンを注入します (プール、シングルトン、およびシングルトンの呼び出しは Java EE コンテナーによって管理されます)。

@Stateless
@WebService
public class WebserviceBean {

@Inject
private StatefullSingleton ejb;

public void addvalue(String sessionId, String value) {
    ejb.addValue(sessionId, value);
}

public List<String> loadValues(String sessionId) {
    return ejb.loadValues(sessionId);
}

}

上記の例は単なるパターンです。本番環境で実装する場合は、セッション ID とマルチスレッドに十分注意する必要があります。

編集:不要な @localBean を削除します

于 2015-02-24T13:11:02.740 に答える