既存の 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 つの問題が発生しました。
- 各リクエスターはアクティブな http リスナーを使用するため、これはスケーラブルではありません。
- クライアントが切断されると、GlassFish は例外をスローします (すべての呼び出しがセキュアな SSL リスナー (デフォルトでは http-listener-2) を通過する必要があるため、SSL 例外)。
com.sun.grizzly.comet.CometEngine を使用する必要がありますか? EJB 3.1 @Asynchronous アノテーションはここで何かをしますか? 私が見つけたすべての例は、適用できないサーブレット API、AJAX、およびその他のテクノロジに依存しています。ありがとうございました。