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 ответ

Если вы хотите избежать перезапуска сервера для получения изменений, я думаю, вам нужно запустить несколько процессов.

Другие вопросы по тегам