如何使用sinatra,sinatra-websocket和redis-rb从Redis消息通知Websockets?

时间:2013-04-19 08:34:03

标签: redis sinatra

我有这个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消息传入时通知所有连接的套接字?

1 个答案:

答案 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