Sto cercando di sfruttare gli eventi inviati dal server nella mia applicazione. Sto usando Sinatra e la gemma sinatra-sse
. Questa gemma avvolge la chiamata Sinatra stream :keep_alive
.Sinatra in streaming con Puma?
Quando si esegue la mia applicazione su Thin, non ho assolutamente problemi e il flusso degli eventi funziona come previsto. Tuttavia, quando ho acceso la mia applicazione per funzionare con Puma, tutto funziona, tranne il mio sse_stream
non fa assolutamente nulla! Restituisce solo una pagina vuota.
mio flusso è configurato in questo modo
get "/logstream/:server" do
if rbcserver = MyApp.servers[params[:server]]
sse_stream do |stream|
rbcserver.add_web_logger(stream)
stream.callback { rbcserver.remove_web_logger(stream) }
end
else
error 404
end
end
sto iniziando sottile in questo modo:
@@puma_instance = Puma::Server.new MyApp::WebUI
@@puma_instance.add_tcp_listener ip, port
@@puma_instance.run
Qualsiasi idea di cosa sta succedendo? Qualsiasi aiuto sarebbe apprezzato.
EDIT: un po 'di informazioni Questo è ciò che cURL dà quando viene eseguito su Puma
$ curl -L -b cookies.txt -c cookies.txt -i http://localhost:9001/logstream/myserver
HTTP/1.1 200 OK
Content-Type: text/event-stream;charset=utf-8
X-Content-Type-Options: nosniff
Transfer-Encoding: chunked
$
considerando che la presente è ciò che accade sul sottile
$ curl -L -b cookies.txt -c cookies.txt -i http://localhost:9001/logstream/myserver
HTTP/1.1 200 OK
Content-Type: text/event-stream;charset=utf-8
X-Content-Type-Options: nosniff
Connection: close
Server: thin 1.5.1 codename Straight Razor
event: <event name>
data: <my data>
event: <event name>
data: <my data>
<continues as more data comes in>
EDIT: Vorrei aggiungere che la mia applicazione utilizza EventMachine al suo interno, quindi l'accoppiamento di sinatra_sse
a EM non è probabilmente un problema.
Bene, la mia applicazione utilizza anche EventMachine, quindi non penso che questo sia causato da EventMachine non in esecuzione. Anche quella particolare linea che hai collegato sembra essere usata solo per mantenere aperta la connessione per quando non ci sono dati inviati. La mia applicazione invia regolarmente una grande quantità di dati, quindi non credo che abbia nulla a che fare con questo:/ –
@IlyaO. Ho appena modificato la mia risposta con un collegamento a un problema github di Puma che illustra i blocchi stradali per un'implementazione Puma di async.callback. –
Ho appena dato un colpo al biglietto. Ti darò la taglia se nessun altro ha qualcosa da aggiungere. –