Mar*_*par 5 multithreading ruby-on-rails redis live-streaming puma
我想将通知流式传输给客户端.为此,我使用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
Run Code Online (Sandbox Code Playgroud)
这里是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);
Run Code Online (Sandbox Code Playgroud)
现在,如果我将某些内容推送到redis,客户端将获得推送通知.所以这很好.但是,当我点击链接时,没有任何事情发生.用Ctrl+ 取消rails服务器(我使用puma)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没有选项,因为我不希望每次开发时都重新启动我的服务器.
还有其他解决方案吗?
| 归档时间: |
|
| 查看次数: |
399 次 |
| 最近记录: |