我有这个https://gist.github.com/ohcibi/5418898 Gist,它基本上只是来自sinatra-websocket github页面的例子和一些粘贴的Redis代码。部分
settings.redis.subscribe 'foobar' do |on|
on.message do |channel, message|
settings.sockets.each do |s|
s.send message
end
end
end
阻止Sinatra应用程序正常启动,subscribe
阻止。我通过将订阅放在ws.onopen
处理程序中取得了一些成功,但这会覆盖每个新websocket的订阅(即只有最新的websocket才会收到消息)。
如何在新的redis消息传入时通知所有连接的套接字?
答案 0 :(得分:0)
我成功将它放在另一个Thread中并使用Thread locals作为套接字:
set(:watcher, Thread.new do
redis = Redis.new
Thread.current['sockets'] = []
redis.subscribe 'foobar' do |on|
on.message do |channel, message|
Thread.current['sockets'].each do |s|
s.send message
end
end
end
end)
然后我做
settings.watcher['sockets'] << ws
而不是
settings.sockets << ws
和
settings.redis.publish 'foobar', msg
通过redis观察者通知套接字。
请参阅更新后的要点:https://gist.github.com/ohcibi/5418898