Rails, ActionController::Live, Puma: ThreadError

5

我想要将通知流传递给客户端。为此,我使用Redis 发布/订阅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推送一些内容,客户端就会收到推送通知。所以这个部分运行良好。但是当我点击链接时,什么也没有发生。在取消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 = trueconfig.eager_load = true不是选项。
是否有其他解决方案?
1个回答

0
如果你想避免重新启动服务器来应用更改,我认为你需要运行多个进程。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接