使用基于SOAP的@Stateless EJB实现长轮询,公开为@WebService

时间:2010-09-21 20:24:19

标签: java soap java-ee jax-ws long-polling

我有一个预先存在的基于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服务调用的持久性:

  1. 每个请求者使用一个活动的http侦听器,因此这不可伸缩,
  2. 当客户端断开连接时,GlassFish会抛出异常(SSL异常,因为所有调用都必须通过安全SSL侦听器(默认情况下为http-listener-2))。
  3. 我需要使用com.sun.grizzly.comet.CometEngine吗? EJB 3.1 @Asynchronous注释在这里做了什么吗?我发现的所有示例都依赖于Servlet API,AJAX和其他不适用的技术。谢谢。

1 个答案:

答案 0 :(得分:0)