3

J2EE と Web サービス (GlassFish 3.1) について学ぼうとしています。この質問は、これのちょっとしたフォローアップです

ステートレス セッション Bean と Web サービスの使用方法を理解しました。@WebServiceメッセージを手作業で解析したくないので、実際には Web サービス ( ) のみを使用しています。できればSOAPよりも軽いものがいいのですが。ただし、ある種の状態を維持したい場合 (ステートフル セッション Bean など) に問題が発生しました。私はこのサイトと他のいくつかのサイトを検索しましたが、バグを見つけるのが難しくなり、スケーラビリティが制限される可能性があるため、これを避けるように勧めています。

「userLogin」メソッドを実行したばかりのユーザーがいて、成功したとします。ユーザーがすでにログインしていることをサーバー上で知るにはどうすればよいでしょうか。@WebServiceでのみ有効であるため、ステートフル セッション Bean に追加することによってこれが不可能であることはわかってい@Statelessます。

Stateless Session Beans とともに HttpSession (HttpServlet を使用) を使用する場合に状態を格納する方法は知っていますが、適切に生成された SOAP メッセージを使用することはできません。

だから私の質問は、ユーザー状態を維持するというこの問題をどのように解決するか、または状態を必要としないように問題を適応させるかです。

4

2 に答える 2

5

WS はステートフルにすることができます: @Stateful アノテーションと WS-Addressing を使用します (たとえば、私の古い質問を参照してください)。

ステートフル サーバーを使用しても問題はありません。結局のところ、ステートフル性が必要な場合、なぜそれを避けるのでしょうか? ステートレスの方がスケーリングとデバッグが容易であることは事実ですが、状態を保持する必要がある場合 (ショッピング カードなど) は保持します。

ただし、考慮すべきことは、タイムアウト後のステートフル サービス インスタンスのクリーンアップです。StatefulWebServiceManager インスタンスとその setTimeout() メソッドを使用します。

また、状態を WS の外部 (データベースなど) に保持し、状態 (セッション) 識別子をパラメーターの 1 つとして渡すこともできます。うまく動作します。

HTTP セッションを使用することは、ステートレス サービスの状態を維持するための非常に簡単な方法ですが、@Stateful と比較すると時代遅れだと思います。その根拠は、必ずしも HTTP 経由で送信する必要がない要求です。@Stateful/WS-Addressing はどのチャネルでも機能しますが、HTTP セッションには HTTP トランスポートが必要です。もちろん、現実の世界では HTTP が主流であるため、この議論は非常に純粋主義的です。

于 2011-06-28T03:31:38.507 に答える
0

ステートレス Bean を Web サービスとして公開する:

import javax.ejb.Remote;
import javax.jws.WebService;
import javax.jws.WebMethod; 


@WebService
/**
* This is an Enterprise Java Bean Service Endpoint Interface
*/
public interface HelloServiceInf extends java.rmi.Remote {

    /**
    * @param phrase java.lang.String
    * @return java.lang.String
    * @throws String The exception description.
    */
    @WebMethod
    java.lang.String sayHello(java.lang.String name) throws java.rmi.RemoteException;
}

ステートレス Bean としての Web サービスの実装

import java.rmi.RemoteException;
import java.util.Properties;
import javax.ejb.Stateless;

/**
* This is a session bean class
*/
@Stateless(name="HelloServiceEJB")
public class HelloServiceBean implements HelloServiceInf {

    public String sayHello(String name) {
        return("Hello "+name +" from first EJB3.0 Web Service");
    }
}

HttpSession に UserInfo (ユーザーの詳細とプロファイル情報オブジェクト) を保持する必要があり、HttpSession に UserInfo がない場合は、Bean (Web サービス) を呼び出す必要があります。

于 2015-09-24T05:30:47.137 に答える