我有一个从多个 IMAP 帐户获取大量电子邮件的 rails 应用程序。
- 我使用sidekiq来处理这些工作。
- 我使用sidetiq来安排作业。
- 我使用redis-semaphore来确保同一用户的重复作业不会相互绊倒。
2个问题:
- 1:当一个作业点击“if s.lock”时, redis-semaphore将其暂停,直到所有之前的作业都完成。我需要取消作业而不是排队。
- 2:如果在作业过程中引发异常,导致崩溃,sidekiq会将作业放回队列中进行重试。我需要取消作业而不是排队。将“sidekiq_options :retry => false”放入代码中似乎没有什么不同。
我的代码:
class FetchMailsJobs
include Sidekiq::Worker
include Sidetiq::Schedulable
tiq { hourly.minute_of_hour(0, 5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55) }
def perform(last_occurrence, current_occurrence)
users = User.all
users.each do |user|
if user.imap_accounts.exists?
ImapJob.perform_async(user._id.to_s)
end
end
end
end
class ImapJob
include Sidekiq::Worker
def perform(user_id)
s = Redis::Semaphore.new("fetch_imap_mails_for_#{user_id}".to_sym, connection: "localhost")
if s.lock
user = User.where(_id: user_id).first
emails = ImapMails.receive_mails(user)
s.unlock
end
end
end