我正在尝试使用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
答案 0 :(得分:0)
Redis订阅是阻止通话。所以你需要在一个单独的线程中执行它。不知道如何在Ruby中做到这一点。但我确信红宝石必须有线程库。
在try..catch中包装阻塞呼叫,您将知道连接何时从服务器端关闭。