Rails, ActionController::Live, Puma: ThreadError
Я хочу передать уведомление клиенту. Для этого я использую Redis pup/sub
и ActionController::Live
, Вот то, что мой StreamingController
похоже:
class StreamingController < ActionController::Base
include ActionController::Live
def stream
response.headers['Content-Type'] = 'text/event-stream'
$redis.psubscribe("user-#{params[:user_id]}:*") do |on|
on.pmessage do |subscription, event, data|
response.stream.write "data: #{data}\n\n"
end
end
rescue IOError
logger.info "Stream closed"
ensure
response.stream.close
end
end
Вот часть JS для прослушивания потока:
var source = new EventSource("/stream?user_id=" + user_id);
source.addEventListener("message", function(e) {
data = jQuery.parseJSON(e.data);
switch(data.type) {
case "unread_receipts":
updateUnreadReceipts(data);
break;
}
}, false);
Теперь, если я что-то нажму на redis, клиент получит push-уведомление. Так что это работает отлично. Но когда я нажимаю на ссылку, ничего не происходит. После отмены сервера rails (я использую puma) с помощью Ctrl+C я получил следующую ошибку:
ThreadError: Attempt to unlock a mutex which is locked by another thread
Проблема может быть решена после добавления config.middleware.delete Rack::Lock
на development.rb, но потом я не вижу вывода консоли после нажатия на клиента. config.cache_classes = true
а также config.eager_load = true
нет вариантов, потому что я не хочу перезапускать свой сервер каждый раз в процессе разработки.
Есть ли другое решение?
1 ответ
Если вы хотите избежать перезапуска сервера для получения изменений, я думаю, вам нужно запустить несколько процессов.