2013-04-05 2 views
1

Я пытаюсь создать систему уведомлений с потоками Redis и Sinatra. Однако я не могу понять, когда соединение закрывается, поэтому блокирующий блок блокировки Redis, кажется, никогда не закрывается. Каков наилучший способ достичь этого?Ловить подключение клиента отключить в подписке 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

Попробуйте установить тайм-аут при создании объекта Redis: 'Redis.new (: тайм-аут => 0)' – fmendez

+0

Я попытался Redis.new (хост: , порт: , тайм-аут: 10) без Синатра потока, но никогда квиты. –

ответ

0

Redis Subscription - это блокирующий вызов. Поэтому вам нужно выполнить его в отдельном потоке. Не знаю, как это сделать в Ruby. Но я уверен, что в рубине должна быть библиотека потоков.

Включите блокирующий вызов в файле try..catch, и вы узнаете, когда соединение закрылось со стороны сервера.

Смежные вопросы