2013-04-14 110 views
11

我有这项任务,我正在从事设备中读取数据并通过Web服务使其可用。数据每秒读取4次。我希望Web客户端拥有开放的HTTP连接,并且只要客户端保持连接处于打开状态,就可以使用chunked transfer以流的形式获取设备读数。Restlet流式传输数据

作为一个概念证明,我想从一个不断生成随机数的服务开始,每秒4次,将其包装在json中并将其传递给客户端。我试图基于twitter streaming api.

松散地建模我正在使用restlet 2.1.2创建该webservice,但我不确定应使用哪种表示形式来实现此目的。我试图寻找这个,但没有发现任何有用的东西。有人能指出我正确的方向,我应该使用什么,也许有些例子。

感谢

+0

你的意思是你应该使用什么子类型的表示形式? JsonRepresentation应该是一个: http://restlet.org/learn/javadocs/snapshot/jse/ext/org/restlet/ext/json/JsonRepresentation.html 它的一个构造函数很方便:JsonRepresentation(Map map) –

+0

你是否被Restlet绑定?我不认为它支持你需要开箱即用,没有[黑客攻击](http://rfc2616.wordpress.com/2010/11/16/streaming-output-from-a-restlet-resource/)。有一个Web服务库处理异步/蒸汽 - [Atmosphere](https://github.com/Atmosphere/atmosphere)。 – pfyod

+0

@DiegoAlcántaraJsonRepresentation不能用于传输动态内容,我不这么认为。 –

回答

3

要达到什么样的你正在尝试做的,我会用WriterRepresentation(但看到我answer to your other question),但我我相当确信你的方向是错误的。

事实上从文档下面的图片你链接

enter image description here

显示Twitter的流API并不打算怎么连被用户连接,而是通过在被访问的商店下载邮件后台进程HTTP。用户只轮询HTTP服务器,该服务器从商店读取消息并将其发送回客户端。

作为断开连接的协议,HTTP支持不可能的大规模可扩展性。如果每个客户端建立一个持续TCP连接,该连接由专用服务器线程支持,您将快速获取服务器资源!此外,用户代理与服务器之间的任何HTTP代理都可能导致意外行为。

因此,如果你被绑定到HTTP协议,用户代理应轮询。您可以使用标头Last-Modified/If-Modified-SinceEtag/If-None-Match来减少网络负载。

但是,如果您可以采用不同的协议,我强烈建议您通过连接的TCP协议尝试服务总线。

+0

我有一个非常独特的要求,因此我走了这条路。 Web服务将只有每个连接1到2个客户端,并且大多数情况下只有一个客户端,所以可扩展性不是问题。 –

+0

尽管如此,HTTP代理可能会成为一个问题。顺便说一句,你正面临的问题是什么?特别是,为什么投票不是一种选择? –

+0

这就像我试图围绕已经存在的客户端创建服务器。曾经存在的服务器是使用不同的技术编写的,我没有源代码来查看它是如何实现的。轮询没有使用,因为连接建立和关闭被认为是一个开销,但现在这个while循环没有被证明是更好的,但它是什么,我试图看看我是否可以使restlet服务工作。 –