Ich schreibe einen Sinatra-Webserver, den ich gerne REST-fähig wäre, aber die Sache ist, dass er mit einem anderen Server interagieren muss, der ausschließlich über Web-Sockets kommuniziert. Also muss das passieren:
Ich bin mir sicher, dass das nicht zu kompliziert ist, aber ich bleibe ein bisschen dran. Wenn die gesamte Web-Socket-Logik in eine einzige Funktion eingebunden werden kann, dann könnte diese Funktion blockiert werden, und das wäre es auch. Aber ich weiß nicht, wie man die Web-Socket-Logik einpackt und blockiert. Was denken Sie? Eine vereinfachte Version von dem, was ich habe, ist unten.
%Vor%BEARBEITEN
Nach weiterem Nachdenken wurde mir klar, dass dies mit einem Thread-Halt und einem Thread-Wake-Up geschehen könnte. Das fühlt sich ziemlich kompliziert an und ich bin mir nicht sicher, wie ich das richtig mit Ruby machen soll, aber das ist die Idee:
%Vor%EDIT 2
Ich habe weitere Fortschritte gemacht. Ich verwende jetzt das Async Sinatra Juwel, für das Thin Webserver. So wird es eingerichtet:
%Vor%Die Sache ist, es funktioniert immer noch nicht. Seine Konsolenausgabe ist wie erwartet:
%Vor% Aber es sendet keine Daten zurück zum Client. Die Methode body 'Closed ...'
scheint keine Wirkung zu haben.
Das Problem war, dass async-sinatra
seine eigenen Threads verwendet hat und auch websocket-client-simple
. Die Lösung besteht darin, Bindungen und die Funktion eval
zu verwenden, obwohl dies überhaupt nicht sehr effizient ist. Ich hoffe, dass Optimierungen oder bessere Lösungen zur Verfügung stehen.
Tags und Links rest websocket asynchronous sinatra thin