2016-09-12 7 views
0

Я только хочу, чтобы выполнить фоновое задание, когда пользователь вошел в систему Когда пользователь вошел в систему, я начинаю рабочий:.Stop sidekiq работника, когда пользователь выходит из

Warden::Manager.after_authentication do |user,auth,opts| 
    ImapWorker.perform_async(user.id) 
    end 

Все мои ImapWorker делает использование ruby's Net::Imap API, чтобы ждать появления новых писем с удаленного сервера электронной почты. Он использует функциональность Idap для ожидания новых событий.

class ImapWorker 
    include Sidekiq::Worker 

    def perform(user_id) 
    user = User.find(user_id) 
    imap = Net::IMAP.new('imap.gmail.com',993,true) 
    imap.login(user.email, user.password) 
    imap.select('INBOX') 

    imap.add_response_handler do |resp| 
     if resp.kind_of?(Net::IMAP::UntaggedResponse) and resp.name == "EXISTS" 
     check_email 
     end 
    end 

    imap.idle 
    end 
end 

Теперь, когда мой пользователь выходит из системы, я хочу закончить работника. Я знаю, что в devise, я могу подключить в бревно из функциональности, как например:

Warden::Manager.before_logout do |user,auth,opts| 
    ... 
end 

Но как именно я останавливаю sidekiq работника?

ответ

0

require 'sidekiq/api'; Sidekiq::ProcessSet.new.each(&:stop!)

+0

Будет ли это остановить все работник или только работник, связанный с пользователем? Я только хочу остановить работника, связанного с пользователем. – Donato

+0

Sidekiq не предназначен для ожидания и ответа на события с заданиями, которые работают вечно. Он только ждет рабочих мест в Redis, и эти задания должны заканчиваться, а не приостанавливаться. Вы не можете делать то, что хотите сделать с Sidekiq. –

+0

У вас есть рекомендации, что я могу использовать в Rails для фонового опроса imap? – Donato