1

既存の SOAP ベースの Web サービスを使用して、ロング ポーリング ベースの通知システムを提供したいと考えています。どうすればこれを実装できますか? クライアントは現在、接続されている他のクライアントから更新を受信する必要がある Java デスクトップ リッチ クライアントです。サーバーは GlassFish 3.01 です。基本的なブロック @WebMethod がありましたが、その使用に起因する問題がありました。Web メソッドのアイデアを示す擬似コードを次に示します。

@WebService(serviceName="mywebservice")
@Stateless
public class MyWebService {
    @WebMethod
    public String longPoll() {
         short ct = 0;
         while(someCondition == false && ct < 60) {
             sleep(1000);  // 1 sec
             ct++;
         }
         if (someCondition)
             return "got value";
         else
             return "";
    }
}

クライアント側では、Future オブジェクトを使用して、これを非同期で呼び出しています。

public Future<?> requestLongPollAsync(Date lastUpdate, 
            AsyncHandler<LongPollResponse> handler) {
    try {
        return mywebservice.longPollAsync(getXMLGregorianCalendar(lastUpdate), 
            handler);
    } 
    // ...
}

クライアント側は正常に動作しているようです。ただし、Web サービス呼び出しの持続性が原因と思われる 2 つの問題が発生しました。

  1. 各リクエスターはアクティブな http リスナーを使用するため、これはスケーラブルではありません。
  2. クライアントが切断されると、GlassFish は例外をスローします (すべての呼び出しがセキュアな SSL リスナー (デフォルトでは http-listener-2) を通過する必要があるため、SSL 例外)。

com.sun.grizzly.comet.CometEngine を使用する必要がありますか? EJB 3.1 @Asynchronous アノテーションはここで何かをしますか? 私が見つけたすべての例は、適用できないサーブレット API、AJAX、およびその他のテクノロジに依存しています。ありがとうございました。

4

1 に答える 1

0

JAX-WS 2.0 非同期プログラミング モデルの使用を検討してください (この場合はコールバック クライアントの可能性が最も高い)。以下にいくつかのリソースを示します。

于 2010-09-21T21:56:08.550 に答える