2013-11-20 8 views
8

mio Resque classe operaialavori Resque, come per interrompere l'esecuzione del lavoro

class WebWorker 

    @queue = :jobs_queue 

    def self.perform(id) 
    //bunch of code here 
    end 
end 

tolgo dalla coda di un certo lavoro come questo

Resque.dequeue(WebWorker,id) 

Ma vorrei per interrompere l'esecuzione di posti di lavoro e riavviare , come lo farei?

+1

http://stackoverflow.com/questions/7416318/how-do-i-a-ear-stuck-stale-resque-workers – snowangel

risposta

1

Se avete voglia di uccidere/fermare un lavoro continuo senza contrassegnare come un processo non riuscito, è possibile utilizzare questo hack.

Ora, dove si desidera interrompere questo codice, è sufficiente raggiungere l'operatore resque che sta eseguendo il lavoro che si desidera interrompere. e uccidi il processo figlio di suo figlio. Qualcosa come uccidere il processo di un nipote di Operaio.

Spiegazione: forcelle

Un operaio che un processo figlio in cui svolgere funzione di eseguire il suo codice. Se uccidiamo direttamente questo processo figlio, questo lavoro verrà interrotto ma verrà contrassegnato come lavoro non riuscito. Ecco perché abbiamo avviato un altro processo figlio in self.perform e ora il processo figlio di esecuzione di kill interrompe questo processo in esecuzione e inoltre, non verrà contrassegnato come non riuscito. Ora possiamo nuovamente accodare il lavoro. Quindi, il compito è quello di come raggiungere il lavoratore che fa il lavoro che dobbiamo smettere di

sono riuscito a farlo scrivendo questo codice per un sistema basato su UNIX (._. "):

Resque.workers.each do |worker| 
    #If condition : "current worker is working and is working on the job that we want to stop and is operating on the queue that we require " and please change this condition as per your requirement   
    if worker.working? and worker.queues.include?("queue_name") and worker.job["payload"]["args"].first==post_id 
      victim = %x[pgrep -P #{worker.pid}] #Getting child's PID 
      victim.strip! 
      victim = %x[pgrep -P #{victim}] #Getting grandchild's PID of worker 
      victim.strip! 
      %x[kill -9 #{victim.to_i}] 
    end 
end 
Problemi correlati