Ho ridotto il mio esempio il più possibile. Nella mia applicazione creo una classe dummy e provo ad accodare il metodo call. Questo viene aggiunto al database fine e con delayed_jobs in esecuzione in background lo preleva e lo aggiorna a bloccato. Ma in realtà non finisce di eseguire il lavoro. Rimane solo nello stato bloccato.Perché non ritardare il processo di lavoro in coda in coda?
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>
serrature il compito qui
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
Poi appende appena. Non capisco perché un compito così semplice non funzioni.
Nota questa console di leva è in esecuzione sulla mia applicazione di binari esistente. Potrebbe essere un problema di configurazione dell'applicazione, ma non sono stato in grado di trovarlo.
Qualche idea? Posso provare a dare più informazioni, ma penso che questo sia tutto.
Il codice vero che sto usando è sotto
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
Il record viene aggiunto alla tabella di ritrovamento delayed_jobs. Quando eseguo bin/delayed_job run
, il record è bloccato ma non elaborato.
seguito è un'immagine del record bloccato
Giusto per chiarire, hai avviato l'elaborazione in background? – Josnidhin
Sì. Ho provato una variante di bin/delayed_job per iniziare a rastrellare i lavori: lavoro e altri. Tutti sembrano iniziare, ma non finiscono. Il database si blocca solo con il primo lavoro in coda nello stato bloccato. –
Ok. Da quello che so quando viene avviato l'elaborazione delayed_job, inizia un nuovo processo. Questo nuovo processo potrebbe non avere accesso al DummyClass come è definito nella leva. Hai provato a chiamare alcuni metodi nei tuoi modelli? – Josnidhin