我想要将通知流传递给客户端。为此,我使用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 = true
和config.eager_load = true
不是选项。是否有其他解决方案?