0

我有这个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 应用程序正确启动 aussubscribe正在阻止。我通过将订阅放入ws.onopen处理程序中取得了小小的成功,但这会覆盖每个新 websocket 的订阅(即只有最新的 websocket 会收到消息)。

如何在收到新的 redis 消息时通知所有连接的套接字?

4

1 回答 1

0

我通过将它放在另一个线程中并使用 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 watcher 通知套接字。

查看更新的要点:https ://gist.github.com/ohcibi/5418898

于 2013-04-19T09:58:27.143 回答