1

我正在尝试使用 Redis 和 Sinatra 流构建通知系统。但是,当连接关闭时我似乎无法捕捉到,因此阻塞的 Redis 订阅块似乎永远不会关闭。实现这一目标的最佳方法是什么?

get '/user/:id/next_notification' do
stream :keep_open do |out|

    $redis.subscribe("notifications:#{params[:id]}") { |on|

        on.message { |channel, msg|
            $redis.unsubscribe
            out << msg
        }
    }

    out.callback { 
        puts "unsub"
        # $redis.unsubscribe 
    }

    out.errback { 
        puts "unsub"
        # $redis.unsubscribe
    }
  end
end
4

1 回答 1

0

Redis Subscription 是一个阻塞调用。所以你需要在一个单独的线程中执行它。不知道如何在 Ruby 中做到这一点。但我确信 ruby​​ 中必须有线程库。

将 Blocking 调用包装在 try..catch 中,您将知道连接何时从服务器端关闭。

于 2013-09-25T09:37:47.380 回答