2011-06-28 26 views
3

私はJ2EEとWebサービス(GlassFish 3.1)について学びたいと思っています。この質問は、thisまでの少しのフォローアップです。ステートフルWebサービスを管理するにはどうすればいいですか?

ステートレスセッションBeansとWebサービスの使用方法を理解しました。私は便宜上、Webサービス(@WebService)のみを使用しています。私はむしろ手動でメッセージを解析しないためです。可能であれば、私はSOAPより軽いものを好みますが。しかし、私は何らかの状態(ステートフルセッションビーンなど)を維持したいときに問題に遭遇しました。私は、このサイトやこれを避けるために私に勧めてくれたいくつかの人を検索しました。バグを見つけにくくなり、スケーラビリティが制限されることがあります。

「userLogin」メソッドを実行したばかりのユーザーがいて、それが成功したとします。たとえば、ログインした後、ユーザーは「getProfile()」をSOAP(引数なし)で呼び出すことができ、そのユーザーの正しい情報が返されます。 @Statelessでのみ有効なので、@WebServiceを自分のステートフルセッションBeanに追加することで、これは不可能です。

ステートレスセッションBeanと一緒にHttpSession(HttpServletを使用)を使用すると状態を保存する方法を知っていますが、うまく生成されたSOAPメッセージを使用できません。

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

答えて

5

WSはステートフルになります@Stateful注釈とWS-Addressingのを使用する(例えば、私のold questionを参照)

犯罪者は何もステートフルなサーバーを持つにはありません。結局のところ、ステートフル・ニーズが必要な場合は、なぜそれを避けるのですか?ステートレスはスケーラビリティとデバッグが簡単ですが、状態を保持する必要がある場合(たとえばショッピングカードの場合など)は、そのまま使用してください。

タイムアウト後にステートフルサービスインスタンスをクリーンアップすることも考慮する必要があります。 StatefulWebServiceManagerインスタンスとそのsetTimeout()メソッドを使用します。

また、状態は、WSの外(例えば、データベース)および状態(セッション)識別子をパラメータの1つとして渡すことができる。うまく動作します。

HTTPセッションを使用すると、ステートレスサービスの状態を維持するのは簡単な方法ですが、@Statefulと比較して古いと考えられます。その根拠は、必要でないリクエストはHTTP経由で来なければならないということです。 @ Stateful/WS-Addressingはどのチャンネルでも動作しますが、HTTPセッションではHTTP転送が必要です。現実の世界ではもちろん、HTTPが一般的なものなので、この議論はかなり純粋です。

+0

ステートフルなものと考えるべきもう一つのことは、システムがクラスター化するのに十分な大きさになる場合です。あなたは、同じソースからの要求が同じボックス上に終わるように、ボックス間で状態を送信する方法や、譲り受けられる方法を持たなければなりません。すべてのことができる、しかしそれは考慮事項です。 – drekka

+0

ありがとうございます。残念ながら、私が欲しい仕事はしていないようです。 APIに関する私の不慣れなことかもしれませんが、@Addressingアノテーションについてはこちら([http://blogs.oracle.com/sujit/entry/ws_addressing_and_stateful_webservice])を読んで、キャッシュされたアノテーションへのアクセスをユーザに提供することがわかりましたリソース。私が欲しかったのは、ユーザーがそれが追跡されていることを知らずに簡単にアクセスできるものでした。 – Level9000

+0

HTTPセッションでもCookieが必要です。ユーザーは知っているでしょう。 WSユーザ(クライアント)の場合は、ハッキング以上で明示的にCookieを読み込んで追加する必要があります。それを@Statefulと比較するときれいです。 –

0

WebサービスとしてのステートレスBeanを公開:ステートレス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; 
} 

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サービス)を呼び出す必要があります。

関連する問題