用户注销时停止sidekiq worker
我只想在用户登录时执行后台作业。当用户登录时,我启动一个worker:
Warden::Manager.after_authentication do |user,auth,opts| ImapWorker.perform_async(user.id) end
我所有的ImapWorker都使用ruby的Net::Imap
API来等待来自远程电子邮件服务器的新电子邮件。 它使用Imap的空闲function来等待新事件。
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
,我可以像这样挂钩注销function:
Warden::Manager.before_logout do |user,auth,opts| ... end
但是我究竟如何阻止sidekiq工作者呢?
require 'sidekiq/api'; Sidekiq::ProcessSet.new.each(&:stop!)