【问题标题】:Implementing long polling with SOAP-based @Stateless EJB exposed as @WebService使用暴露为 @WebService 的基于 SOAP 的 @Stateless EJB 实现长轮询
【发布时间】:2010-09-21 20:24:18
【问题描述】:

我有一个预先存在的基于 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))。

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

【问题讨论】:

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


    【解决方案1】:

    【讨论】:

    • 帕斯卡 - 感谢您的回复。我认为我的客户端工作得很好。问题似乎仅在服务器端。我编辑了我的问题以添加有关我正在向 Web 服务进行的客户端调用的信息。
    猜你喜欢
    • 2014-11-29
    • 2010-09-24
    • 1970-01-01
    • 2012-10-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多