我使用以下一堆技术处理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
告诉我如何做得更好?使用什么技术?
其他信息: 是的,我认为这将是高负荷,许多用户在互联网上服务。
答案 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。听起来它的长轮询选项可能对你有用。