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

Java 使用基于SOAP的@Stateless EJB作为@WebService公开实现长轮询,java,soap,jakarta-ee,jax-ws,long-polling,Java,Soap,Jakarta Ee,Jax Ws,Long Polling,我有一个预先存在的基于SOAP的web服务,我想用它提供一个长时间的基于轮询的通知系统。我如何实现这一点?客户端当前是Java桌面富客户端,必须从其他连接的客户端接收更新。服务器是GlassFish 3.01。我有一个基本的blocking@WebMethod,但由于它的使用,我遇到了一些问题。下面是一些显示web方法思想的伪代码: @WebService(serviceName="mywebservice") @Stateless public class MyWebService {

我有一个预先存在的基于SOAP的web服务,我想用它提供一个长时间的基于轮询的通知系统。我如何实现这一点?客户端当前是Java桌面富客户端,必须从其他连接的客户端接收更新。服务器是GlassFish 3.01。我有一个基本的blocking@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服务调用的持久性:

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

考虑使用JAX-WS2.0异步编程模型,在您的情况下,最有可能使用回调客户端。以下是一些资源:


帕斯卡-谢谢你的回复。我想,我的客户方工作得很好。问题似乎只存在于服务器端。我编辑了我的问题,以添加有关我正在对web服务进行的客户端调用的信息。