2014-12-19 45 views
5

我儘可能地去掉了我的例子。在我的應用程序中,我創建了一個虛擬類並嘗試排隊調用方法。這會被添加到數據庫中,並且在後臺運行的delayed_jobs會將其選中並將其更新爲鎖定狀態。但它並沒有真正完成這項工作。它只是處於鎖定狀態。爲什麼不延遲工作過程入隊工作?

pry(main)> class DummyClass 
pry(main)* def self.call 
pry(main)*  puts 'will this ever work?' 
pry(main)* end 
pry(main)* end 
=> :call 

pry(main)> DummyClass.delay.call 

(0.2ms) BEGIN 
SQL (0.3ms) INSERT INTO `delayed_jobs` (`created_at`, `handler`, `queue`, `run_at`, `updated_at`) VALUES ('2014-12-19 12:11:40.006107', '--- !ruby/object:Delayed::PerformableMethod\nobject: !ruby/class \'DummyClass\'\nmethod_name: :call\nargs: []\n', 'default', '2014-12-19 12:11:40.005811', '2014-12-19 12:11:40.006107') 
(16.2ms) COMMIT 

=> #<Delayed::Backend::ActiveRecord::Job:0x007fd0fdec0e20 
id: 22, 
priority: 0, 
attempts: 0, 
handler: "--- !ruby/object:Delayed::PerformableMethod\nobject: !ruby/class 'DummyClass'\nmethod_name: :call\nargs: []\n", 
last_error: nil, 
run_at: Fri, 19 Dec 2014 14:11:40 CAT +02:00, 
locked_at: nil, 
failed_at: nil, 
locked_by: nil, 
queue: "default", 
created_at: Fri, 19 Dec 2014 14:11:40 CAT +02:00, 
updated_at: Fri, 19 Dec 2014 14:11:40 CAT +02:00> 

鎖定這裏的任務

SQL (0.8ms) UPDATE `delayed_jobs` SET `delayed_jobs`.`locked_at` = '2014-12-19 12:17:20.031925', `delayed_jobs`.`locked_by` = 'delayed_job host:Ryan-Mes-MacBook-Pro-2.local pid:60080' WHERE ((run_at <= '2014-12-19 12:17:20.031003' AND (locked_at IS NULL OR locked_at < '2014-12-19 12:12:20.031154') OR locked_by = 'delayed_job host:Ryan-Mes-MacBook-Pro-2.local pid:60080') AND failed_at IS NULL) ORDER BY priority ASC, run_at ASC LIMIT 1 

然後,它只是掛起。我不明白爲什麼這樣一個簡單的任務不起作用。

請注意,這個pry控制檯正在我現有的rails應用程序上運行。這可能是一個應用程序配置問題,但我一直無法找到它。

任何想法?我可以嘗試提供更多信息,但我認爲這是一切。

我使用的實際代碼如下

module Events 
    class ForwardRequestToPulse 
    def self.call 
     puts 'will this ever work' 
    end 
    end 
end 

class MyTestController < ApplicationController 
    def index 
    Events::ForwardRequestToPulse.delay.call 
    end 
end 

的記錄添加到delayed_jobs表查找。當我運行bin/delayed_job run時,記錄被鎖定但未處理。

下面是鎖定的記錄的圖像 Locked record in database

+0

只是要說清楚,你開始了後臺處理嗎? – Josnidhin 2014-12-24 05:09:13

+0

是的。我嘗試了bin/delayed_job開始的一個變體來開始工作:工作和其他。似乎都開始了,但沒有完成。數據庫只是在排隊處於鎖定狀態的第一個作業時掛起。 – 2014-12-24 07:28:30

+0

好的。從我知道什麼時候開始delayed_job處理開始一個新的過程。這個新進程可能無法訪問DummyClass,因爲它是在pry中定義的。你有沒有嘗試過在模型中調用一些方法? – Josnidhin 2014-12-24 09:00:43

回答

1

後襬弄寶石,我把問題縮小到delayed_job,不正確地尋找鎖定的記錄。它在locked_at的過濾器中包含了毫秒。 mySql存儲沒有毫秒的日期時間,因此沒有任何東西被拾取。在github delayed_job_active_record(我認爲問題是我的!)中的寶石多一點研究後,我發現這fix。這解決了我的問題。

它發生在我身上的原因是我在修復之前引用了最新的gem 4.0.2!只是我的運氣。

所以,如果你使用4.0.2 ...只是升級,它應該消失。

4

我更熟悉Sidekiq,但我認爲這個問題是你定義一個類在軌運行控制檯和工人都在運行單獨的過程。工作人員不知道DummyClass並且未能執行該作業。我建議:

  1. 使該類一個Rails模型(假人等)
  2. 重啓延遲工作
  3. 插入記錄到的delayed_job表
  4. 檢查鎖定狀態
+0

我同意@eabraham--工作人員必須已經有權訪問實現(類定義),因爲它會序列化要按名稱和值調用的作業,這些作業必須在稍後重新組合。 – SciPhi 2014-12-28 19:24:47

+0

我明白你的意思了。我認爲這個例子會簡化我的解釋。在我的rails應用程序中使用服務對象時,我仍然遇到同樣的問題(這是我的原始問題)。任何關於如果我的服務對象顯示相同行爲時可能出現的錯誤的建議。 Delayed_job似乎鎖定了數據庫中的記錄,然後什麼都不做。它不會至少失敗嗎? – 2015-01-01 19:06:23

+0

你可以發佈由DelayedJob執行的實際代碼,而不是虛擬代碼嗎?對於我來說,如果沒有明確地看到你正在運行什麼,這很難。 – eabraham 2015-01-02 01:54:38