在redis订阅中捕获客户端连接断开连接

时间:2013-04-05 01:52:34

标签: ruby redis sinatra

我正在尝试使用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

1 个答案:

答案 0 :(得分:0)

Redis订阅是阻止通话。所以你需要在一个单独的线程中执行它。不知道如何在Ruby中做到这一点。但我确信红宝石必须有线程库。

在try..catch中包装阻塞呼叫,您将知道连接何时从服务器端关闭。