前段时间做了一个项目,从仪器上采集数据(仪器会源源不断的发送数据)并将数据push到web browser上,由于要保证能够离线操作,采用在客户端电脑上部署一个嵌入小jetty服务器的方案,因此不能够安装AMQ来实现push的功能(AMQ太大),同时要保证仪器采集的数据不会丢失,导致不能使用jetty continuations(丢失数据频繁) 首先来看段js代码:
此时的常连接实际是个虚假的长连接,是以反复的与servlet建立连接并读取数据而实现的。而这种方式,当servlet端正源源不断的往browser段传输数据时,browser会有一部分时间消耗在建立连接、处理数据、关闭连接的过程中,因此导致servlet传输的数据会丢失. 因此做了一个Comet Queue组件,能够实现以下目标: 1. 代码少,建立在spring上 2. 对于每个http session创建一个独立的session, 这些session有自己的生命管理周期,当长时间没有服务请求这些session时,会自动被注销. 3. 数据产生者发送数据给订阅者,保证每个请求都能拿到自己会话中的数据,而不会丢失。 这样一个小功能,适合在对comet传输的数据要求准确性较高的要求中使用,他可以针对每一个http session创建一个session,将session保存在池中。一方面,数据产生者产生数据时,往池中的每个session添加数据;另一方面,数据消费者从自己的session中取出数据。这样就保证了数据不会丢失。 架构蓝图如下图所示:
Copyright @ Danfo Yam Powered by: .Text and ASP.NET Theme by: .NET Monster