用户退出时停止sidekiq工作人员

时间:2016-09-12 23:04:44

标签: ruby-on-rails sidekiq

我只想在用户登录时执行后台作业。当用户登录时,我启动了一个工作人员:

  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工作人员?

1 个答案:

答案 0 :(得分:0)

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