2011-05-16 93 views
7
class Radar 
include Mongoid::Document 
after_save :post_on_facebook 

private 

def post_on_facebook 
    if self.user.settings.post_facebook 
    Delayed::Job.enqueue(::FacebookJob.new(self.user,self.body,url,self.title),0,self.active_from) 
    end 
end 

end 

class FacebookJob < Struct.new(:user,:body,:url,:title) 
    include SocialPluginsHelper 

    def perform 
    facebook_client(user).publish_feed('', :message => body, :link => url, :name => title) 
    end 
end 

我想在特定日期執行post_on_facebook方法。我將此日期存儲在「active_from」字段中。delayed_job。從隊列中刪除作業

上面的代碼正在工作,工作在正確的日期執行。

但在某些情況下,我首先創建Radar對象並將一些作業發送到延遲作業隊列。之後,我更新這個對象併發送另一個作業到延遲作業。

這是錯誤的行爲,因爲我不會在正確的時間只執行一次作業。在這個實現中,我將有2個將被執行的工作。我如何刪除以前的作業,只更新一個作業?

Rails 3.0.7 
Delayed Job => 2.1.4 https://github.com/collectiveidea/delayed_job 

PS:對不起,我的英語我試着盡我所能

回答

13

聲音就像你想要排隊任何工作,如果一個雷達對象得到更新和重新排隊。

Delayed :: Job.enqueue應該返回一個Delayed :: Job記錄,所以你可以從中獲取ID並將其保存回雷達記錄(在雷達文檔中爲其創建一個字段),以便找到它稍後再輕鬆一點。

您應該將其更改爲before_save,以免您輸入無限循環的保存。

before_save :post_on_facebook 

def post_on_facebook 
    if self.user.settings.post_facebook && self.valid? 

    # delete existing delayed_job if present 
    Delayed::Job.find(self.delayed_job_id).destroy if self.delayed_job_id 

    # enqueue job 
    dj = Delayed::Job.enqueue(
     ::FacebookJob.new(self.user,self.body,url,self.title),0,self.active_from 
    ) 

    # save id of delayed job on radar record 
    self.delayed_job_id = dj.id 

    end 
end 
+0

@Unixmonkey ......如果什麼工作正在'after_save'回調中創建。 – Rohit 2011-12-16 06:38:44

+0

@Rohit after_save將運行此方法,並且delayed_job_id不會在記錄上設置(因爲您無法在after_save中調用保存而沒有進入無限循環) – Unixmonkey 2011-12-19 17:52:39

3

你嘗試從延遲作業存儲ID,然後將其保存爲可能的缺失: 如

job_id = Delayed::Job.enqueue(::FacebookJob.new(self.user,self.body,url,self.title),0,self.active_from) 
job = Delayed::Job.find(job_id) 
job.delete 
+0

有趣的是,如果拖延:: Worker.delay_jobs =假,這將打破,因爲它看起來像排隊操作只是運行工作,從來沒有經歷過它保存到數據庫中 – 2012-01-23 09:47:51