2014-09-26 36 views
1

我日程提醒的電子郵件,當用戶在創建操作使用下面的代碼創建一個特定日期的任務:Sidekiq - 刪除預定作業任務時被刪除

if @post.save 
    EmailWorker.perform_in(@time.minutes, @post.id) 
end 

我想刪除計劃的提醒郵件每當關聯的任務被刪除。我試圖用一個模型方法上before_destroy

before_destroy :destroy_sidekiq_job 

def destroy_sidekiq_job 
    post_id = self.id 
    queue = Sidekiq::Queue.new('critical') 
    queue.each do |job| 
    if job.klass == 'EmailWorker' && job.args.first == post_id 
     job.delete 
    end 
    end 
end 

然而,作業不從隊列中刪除。任何建議我來解決這個問題?

回答

4

計劃作業不是隊列中尚未使用Sidekiq::ScheduledSet找到調度作業:

def destroy_sidekiq_jobs 
    scheduled = Sidekiq::ScheduledSet.new 
    scheduled.each do |job| 
    if job.klass == 'EmailWorker' && job.args.first == id 
     job.delete 
    end 
    end 
end 
+0

你搖滾!萬分感謝! – user3224820 2014-09-26 21:27:58

+0

只是一個簡單的問題 - 他們爲什麼不在排隊呢? – user3224820 2014-09-26 21:31:05

+1

只有準備好運行的作業纔在隊列中。在此之前,他們住在ScheduledSet中,並由調度程序移入隊列。 – infused 2014-09-26 22:07:30

5

不要這樣做。讓Sidekiq執行這個工作,但是驗證郵件是否存在,並且當電子郵件作業運行時

def perform(post_id) 
    post = Post.find_by_id(post_id) 
    return unless post 

    ... 
end 
+0

這個效果很好。我怎麼去添加一個檢查updated_at?不知道如何抓住變量進行更新並對其進行比較 – 2015-01-21 18:45:04

+1

您的意思是'如果post.updated_at> some_date'返回? – 2015-01-21 18:53:00

+0

是的,但檢查將post.updated_at == quene.updated_at。我在updated_at中傳遞了一個arg,它表示redis和post id一起保存。 – 2015-01-21 18:58:50