通过jQuery / CDI进行长期轮询:Bean函数需要sleep()功能

时间:2014-04-03 15:14:02

标签: multithreading cdi

尝试在没有Websockets或其他任何内容的情况下实现简单的Ajax轮询。

现在,我的ajax看起来像这样:

// start simple long term polling
(function poll(){
    $.ajax({ 
        url: "/app/api/ltp/receive", 
        success: function(data) {
            // do some stuff
        },
        dataType: "json", 
        complete: poll, 
        timeout: 30000 // again and again
    });
})();

问题出在服务器端:

我必须检查消息队列中是否有新消息,并在再次检查之前阻止一段时间。当有消息时,我可以将json发送回客户端,保持连接超时超时。

但据我所知,在CDI中,我绝不应该使用Thread.sleep(ms)来阻止,对吧?我该怎么做呢?

2 个答案:

答案 0 :(得分:1)

这篇文章可能会有所帮助:

刘新宇博士的

Asynchronous processing support in Servlet 3.0

简而言之,它解释了对于Ajax(Comet,Long Polling),当服务器上有新消息时,Servlet 3.0规范中的新Async支持可用于实现延迟应答(HTTP响应)。

代码(第2页)使用ConcurrentLinkedQueue来存储消息,然后调用其poll()方法来等待新消息,而不是休眠。

本文还解释了这种新的Async支持有助于减少资源使用,因为启动请求/响应循环的原始线程会立即返回到线程池并准备好为其他任务提供服务。

目前我正在开发一个基于GlassFish 4,消息驱动bean(JMS)和JavaServer Faces的Ajax长轮询演示,所以我在这里找到了你的问题,如果我找到更多有用的信息,我会回来示例代码。

另请参阅:I don't understand Async support in servlets 3.0 API

答案 1 :(得分:0)

是什么让你相信你需要在你的CDI bean中睡觉?通过查看您从中提取这些消息的任何消息队列,终端是否应该只对其获得的任何消息作出反应?