2014-12-19 11 views
5

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 Locked record in database

+0

Giusto per chiarire, hai avviato l'elaborazione in background? – Josnidhin

+0

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. –

+0

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

risposta

1

bloccato dopo giocherellando nella gemma ho ridotto il problema a delayed_job senza cercare correttamente i record bloccati. Stava includendo i millisecondi nel filtro per locked_at. mySql memorizza i dati senza i millisecondi, quindi non è stato raccolto nulla. Dopo un po 'più di ricerca nella gemma in github delayed_job_active_record (ho pensato che il problema ero io!) Ho trovato questo fix. Questo risolve il mio problema.

La ragione per cui stava accadendo era che stavo riferendo l'ultima gemma 4.0.2 prima di questa correzione! Solo la mia fortuna.

Quindi, se si utilizza 4.0.2 ... basta aggiornare e dovrebbe scomparire.

4

Sono più familiarità con Sidekiq ma penso che il problema è che si sta definendo una classe per l'esecuzione nella console rotaie e gli operai vengono eseguiti in un processo separato. I lavoratori non sono a conoscenza di un DummyClass e non riescono a eseguire il lavoro. Mi raccomando:

  1. rendere questa classe un modello Rails (Dummy etc.)
  2. riavvio ritardato lavoro
  3. Inserire il record nella tabella delayed_job
  4. Controllare lo stato
+0

Sono d'accordo con @eabraham - il lavoratore deve già avere accesso all'implementazione (la definizione della classe) perché serializza il lavoro da chiamare per nome e valori, che devono essere ricostituiti in seguito – SciPhi

+0

Vedo quello che stai dicendo. Pensavo che questo esempio avrebbe semplificato la mia spiegazione. Ho ancora lo stesso problema quando utilizzo un oggetto di servizio nella mia applicazione di rotaie (questo è il mio problema originale). Qualche suggerimento su quale potrebbe essere l'errore se il mio oggetto servizio mostra lo stesso comportamento. Delayed_job sembra bloccare il record nel database e quindi non fare nulla. Non fallirebbe almeno? –

+0

Puoi pubblicare il codice effettivo che viene eseguito da DelayedJob, invece del codice fittizio? È difficile per me aiutare senza vedere specificamente cosa stai facendo. – eabraham