2010-09-21 27 views
1

我有一个预先存在的基于SOAP的Web服务,我希望提供一个基于长轮询的通知系统。我怎样才能实现这个?客户端目前是一个Java桌面富客户端,它必须从其他连接的客户端接收更新。服务器是GlassFish 3.01。我有一个基本的阻塞@WebMethod,但是由于它的使用而导致问题。这里是展示Web方法的想法有些伪代码:使用作为@WebService公开的基于SOAP的@Stateless EJB实现长轮询

@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); 
    } 
    // ... 
} 

客户端似乎工作好。不过,我有2个问题,从这个站起身来,似乎是由于Web服务调用的持久性质:

  1. 每个请求者使用有源HTTP侦听器,所以这是不可伸缩的,
  2. 当客户端断开连接时,GlassFish将引发异常(SSL异常,因为所有调用都必须通过安全SSL侦听器(默认情况下为http-listener-2))。

我需要使用com.sun.grizzly.comet.CometEngine吗? EJB 3.1 @Asynchronous注释是否在这里执行任何操作?我发现的所有示例都依赖于Servlet API,AJAX和其他不适用的技术。谢谢。

回答

0
+0

帕斯卡尔 - 感谢您的回复。我认为,我的客户端运行良好。问题看起来只在服务器端。我编辑了我的问题,以添加关于我正在对Web服务进行的客户端调用的信息。 – 2010-09-23 17:45:18