Spring MVC,最佳实践如何经常轮询服务器

时间:2014-03-17 18:48:25

标签: java spring hibernate spring-mvc polling

我使用以下一堆技术处理Web应用程序:Spring,Hibernate,JSP。我有一个任务是创建一个用户社交元素 - 消息。作为实施消息系统的标准,我采取facebook系统。我遇到的问题是每隔1-5秒(我必须采取什么时间段?)来检索有关未读消息的信息。此外,我想轮询服务器以在对话页面(如聊天)检索新消息。我做了什么:

获取计数未读消息的示例代码。

服务器端:

@RequestMapping(value = "/getCountUserUnreadMessages", method = RequestMethod.POST)
public @ResponseBody Callable<Integer> getCountUserUnreadMessages(@ActiveUser final SmartUserDetails smartUserDetails) {
    // TODO add additional security checks using username and active user
    return new Callable<Integer>() {
        @Override
        public Integer call() throws Exception {

            Integer countUserUnreadMessages = messageService.findCountUserUnreadMessages(smartUserDetails.getSmartUser());
            while (countUserUnreadMessages == 0) {
                Thread.sleep(1000);
                countUserUnreadMessages = messageService.findCountUserUnreadMessages(smartUserDetails.getSmartUser());
            }
            return countUserUnreadMessages;
        }
    };
}

客户方:

(function poll(){                                                  
    setTimeout(function () {                                       
        $.ajax({                                                   
            type: "post",                                          
            url: "/messages/getCountUserUnreadMessages",           
            cache: false,                                          
            success: function (response) {                         
                $("#countUnreadMessages").text(response);          
            }, dataType: "json", complete: poll, timeout: 1000 }); 
    }, 3000);                                                      
})();    

所以客户端每秒发送一个请求来检索计数未读消息,并在3秒内超时(这是一个好的决定吗?)。

但我认为这是有史以来最糟糕的可调用代码:-P

告诉我如何做得更好?使用什么技术?

其他信息: 是的,我认为这将是高负荷,许多用户在互联网上服务。

2 个答案:

答案 0 :(得分:2)

尝试Spring 4 WebSocket支持:

http://docs.spring.io/spring/docs/current/spring-framework-reference/html/websocket.html

WebSockets支持通过HTTP建立的专用TCP连接进行全双工通信。

答案 1 :(得分:1)

如果您希望此应用程序必须完全扩展,我会使该时间间隔更像是每30到90秒。否则你基本上就是在自己设计自己的内置DOS攻击。

您可以查看Spring Sockets。听起来它的长轮询选项可能对你有用。

相关问题