2013-04-14 9 views
11

Ich habe diese Aufgabe, die ich unternehme, wo ich Daten von einem Gerät lesen und es über einen Webdienst verfügbar machen würde. Die Daten werden 4 mal pro Sekunde gelesen. Ich möchte, dass die Webclients eine offene HTTP-Verbindung haben und die Gerätewerte als Stream unter Verwendung von chunked transfer erhalten, solange der Client die Verbindung offen hält.Restlet Streaming-Daten

Als Beweis des Konzepts, ich möchte mit einem Dienst beginnen, der ständig eine zufällige Zahl erzeugt, 4 mal pro Sekunde, wickelt es in JSON und stream das zu Kunden. Ich versuche, es lose basierend auf twitter streaming api.

zu modellieren Ich verwende Restlet 2.1.2, um diesen Webservice zu erstellen, aber ich bin mir nicht sicher, welche Darstellung ich verwenden sollte, um dies zu erreichen. Ich habe versucht, danach zu suchen, aber nichts nützliches gefunden. Könnte mir jemand in die richtige Richtung weisen, was ich benutzen soll und vielleicht vielleicht ein paar Beispiele?

Dank

+0

Meinst du was SubType der Repräsentation sollten Sie verwenden? JsonRepresentation sollte derjenige sein: http://restlet.org/learn/javadocs/snapshot/jse/ext/org/restlet/ext/json/JsonRepresentation.html Einer seiner Konstruktoren ist praktisch: JsonRepresentation (Map Karte) –

+0

Sind Sie an Restlet gebunden? Ich denke nicht, dass es unterstützt, was Sie out of the box ohne einige [Hacking] benötigen (http://rfc2616.wordpress.com/2010/11/16/streaming-output-from-a-restlet-resource/). Es gibt eine Webservice-Bibliothek, die async/dämpfen - [Atmosphere] (https://github.com/Atmosphere/atmosphere) verarbeitet. – pfyod

+0

@ DiegoAlcántara JsonRepresentation kann nicht zum Streamen von dynamischen Inhalten verwendet werden, denke ich nicht. –

Antwort

3

Um das zu erreichen, was Sie versuchen zu tun, ich die WriterRepresentation verwenden würde (siehe aber meine answer to your other question), aber ich bin mir ziemlich sicher, dass Sie in die falsche architektonische Richtung gehen.

die Tat das folgende Bild aus der Dokumentation verknüpfen Sie

enter image description here

zeigen, wie auch der Twitter-Streaming api von den Benutzern nicht verbunden werden soll, sondern durch Hintergrundprozesse, die Nachrichten in einem Speicher zugänglich herunterladen das HTTP. Benutzer rufen nur den HTTP-Server ab, der die Nachrichten aus dem Speicher liest und die zurück an die Clients sendet.

Als getrennt Protokoll, HTTP ermöglichen massive Skalierbarkeit, die sonst nicht möglich wäre. Wenn jeder Client eine persistente TCP-Verbindung herstellt, die von einem dedizierten Server-Thread unterstützt wird, werden Sie schnell Serverressourcen erleiden! Darüber hinaus kann jeder HTTP-Proxy zwischen dem Benutzeragenten und dem Server zu unerwartetem Verhalten führen.

Wenn Sie also an das HTTP-Protokoll gebunden sind, sollte der Benutzeragent abfragen. Sie können die Netzwerklast mit Headern wie Last-Modified/If-Modified-Since oder Etag/If-None-Match reduzieren.

Wenn Sie jedoch ein anderes Protokoll annehmen können, empfehle ich dringend, einen Service-Bus über ein verbundenes TCP-Protokoll zu versuchen.

+0

Ich habe eine sehr einzigartige Anforderung und daher bin ich auf diesem Weg. Der Webservice wird nur mit 1 bis 2 Clients verbunden sein, und nur einer zum größten Teil, so dass die Skalierbarkeit kein Problem darstellt. –

+0

Dennoch könnten HTTP-Proxies ein Problem werden. BTW, was genau ist das Problem, vor dem Sie stehen? Vor allem, warum Umfragen keine Option sind? –

+0

Es ist wie, ich versuche, einen Server um einen bereits vorhandenen Client zu erstellen. Der Server, der früher existierte, wurde mit einer anderen Technologie geschrieben, und ich habe nicht die Quellbasis, um zu sehen, wie er implementiert wurde. Polling wurde nicht verwendet, da der Aufbau und das Schließen der Verbindung als Overhead betrachtet wurde, aber jetzt erweist sich diese while-Schleife als nicht besser, aber es ist, was es ist, und ich versuche zu sehen, ob ich den Restlet-Dienst funktionieren lassen kann. –