如何使用spring mvc实现组聊天的服务器端事件

时间:2015-04-09 11:22:27

标签: spring-mvc messaging server-sent-events

我正在实现基于主题的聊天消息系统,作为更大应用程序的一部分,其中某些组(有多个组)成员可以删除主题上的消息。只有小组成员才能收到这些消息。我将使用基于spring mvc的REST控制器作为通用REST端点来为移动设备和Web用户提供服务。

目前,我知道我可以为Android和基于ios的设备使用推送通知,并更新有关发布的新邮件的组。但是,我更关心的是我将如何处理服务器端的事情。 我正在考虑使用服务器端事件机制将消息推送给其他组成员。这样做是否正确?

如果是,其他问题是如何设计这个。假设一个组成员创建一个消息并发送它。事情会发生。

在服务器端,处理程序Rest控制器将通过存储在数据库中并打开JMS连接来处理消息,以发布此消息。一些侦听器(这可能是什么类型的类?)应该接收此消息并且应该能够推送说5个其他小组成员的消息。我该如何设计呢? 据我所知,所有5个小组成员必须让浏览器打开基于Eventsource的连接,以便继续监听来自服务器的所有事件(和相关数据)。 如何使用消息传递(或其他一些适当的机制)和服务器端事件(REST控制器)在服务器端协同工作并仅将消息推送到组成员?

如何从我的REST控制器向目标成员发送消息,该控制器将事件流式传输到侦听客户端?

感谢您在阅读如此长时间的查询时的耐心等待。

1 个答案:

答案 0 :(得分:1)

我认为您最好使用像Cettia这样的实时Web应用程序框架来集中您的业务逻辑,而不必与低级别的细节建立不必要的联系。

作为一个低级细节,Server-Sent Events只是另一种HTTP流技术,它是Comet的传统技术之一。如果用户使用不委托每个响应块直​​到某些整个响应结束的代理,则HTTP流不起作用。对于此类用户,您应该使用HTTP长轮询,这也是此类技术之一,但在性能方面比流式传输更差。所有这些技术都只提供单向连接,因此您需要做更多的工作才能使它们成为伪全双工来编写聊天应用程序。这些问题在RFC 6202中得到了很好的解释。您可能已经听说过,WebSocket提供全双工连接,但在现实世界中,许多公司代理,防火墙和防病毒软件由于某种原因阻止了它。至少要使用可靠的全双工连接,你应该使用制作精良的框架。例如,在Cettia中,客户端在内部尝试各种传输,包括在性能顺序中列出的传输,并因此提供真正有效的全双工连接。

要像处理5个小组成员那样处理一组套接字,您应该使用一种主题概念,如您所指出的那样。在Cettia中,tag提供了这些功能。例如,您可以标记某个套接字,即socket.tag("group1"),并以舒适的方式处理带标记的套接字,例如server.byTag("group1").send("chat", "welcome")。通过一些集群工作,您可以将此类操作发布到集群中的所有节点(使用JMS,Hazelcast或任何pub-sub系统),以便在任何服务器中标记为group1的任何套接字都将发送chat发布的操作的数据为welcome的事件。如果一些用户断开一段时间即将wifi切换到3g并且其他一些用户向该用户发送一些消息呢?当用户再次连接时,您需要一种方法来重新发送此类消息。 (在Cettia中,处理此类问题的功能在路线图上)正如您所看到的,编写一个简单的实时Web应用程序需要很多功能。

以下是工作示例。

由于我是Cettia的作者,我给了你Cettia示例,但这些功能对于这样的框架是很常见的,所以你可能会发现其他项目也以自己的方式支持它们。