1

У меня есть проблема с рельсами ActionController::LiveRails ActionController :: Live - Посылает все сразу, а не асинхронные

В конце концов, я хочу показать прогресс FFMPEG пользователя, но сейчас я хочу, чтобы это минимальный пример работы:

Rails media_controller.rb:

class MediaController < ApplicationController 
    include ActionController::Live 

    def stream 
    puts "stream function loaded" 

     response.headers['Content-Type'] = 'text/event-stream' 
     i = 0 
     begin 
     response.stream.write "data: 1\n\n" 
     sleep 0.5 
     i += 1 
     puts "response... data: " + i.to_s 
     end while i < 10 
    response.stream.close 
    end 
end 

Javascript:

source = new EventSource("/test/0"); 
source.addEventListener("message", function(response) { 
    // Do something with response.data 
    console.log('I have received a response from the server: ' + response); 
}, false); 

Когда я перехожу на сайт, нет ошибок JavaScript. Как только я перейду на сайт, «поток» -Action of MediaController успешно вызван. Я могу проверить это, посмотрев на Server-Console. Это дает мне следующий результат. После каждой строки ответа, есть 500мс задержка, как ожидалось:

stream function loaded 
response... data: 1 
response... data: 2 
response... data: 3 
response... data: 4 
response... data: 5 
response... data: 6 
response... data: 7 
response... data: 8 
response... data: 9 
response... data: 10 
Completed 200 OK in 5005ms (ActiveRecord: 0.8ms) 

На JavaScript стороне, он дает мне следующий результат:

(10x) I have received a response from the server: [object MessageEvent] 

Но проблема здесь, что он посылает все эти 10 сообщений с сервера через 5 секунд в то же время! Ожидаемое поведение, однако, то, что должно отправить мне 1 сообщение каждые 0,5 секунды!

Так что я делаю неправильно здесь? Где ошибка?

Screenshot Rails Console/JavaScript Console

ответ

0

я мог бы решить эту проблему, используя другой веб-сервер. Раньше я использовал thin и я нашел, что это Post on SO:

вы не можете использовать AC::Live с Thin

Объяснение можно найти здесь:

https://github.com/macournoyer/thin/issues/254#issuecomment-67494889

Thin Безразлично работа с потоковой передачей и ActionController :: Live.

Единственный подход, который работает с Thin, заключается в использовании асинхронного API: https://github.com/macournoyer/thin_async. Тонко построено именно для такого рода вещей и делает его масштабным.

Или проще, используйте это: https://github.com/SamSaffron/message_bus.

Так переключение на другой сервер решается вопрос:

gem 'puma' 

Начиная с

rails s Puma 

 Смежные вопросы

  • Нет связанных вопросов^_^