我只想在用户登录时执行后台作业。当用户登录时,我启动了一个工作人员:
Warden::Manager.after_authentication do |user,auth,opts|
ImapWorker.perform_async(user.id)
end
我的所有ImapWorker都使用ruby的Net::Imap
API来等待来自远程电子邮件服务器的新电子邮件。它使用Imap的空闲功能来等待新事件。
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 :(得分:0)
require 'sidekiq/api'; Sidekiq::ProcessSet.new.each(&:stop!)