2013-11-20 22 views
8

My Resque işçi sınıfı işini yayından nasılResque işler

class WebWorker 

    @queue = :jobs_queue 

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

Ben kuyruktan bu

Resque.dequeue(WebWorker,id) 

gibi belirli bir işi kaldırmak Ama işi ve yeniden çalışmasını durdurmak istiyoruz Bunu nasıl yapardım? Bu komut işini durdurmak ve başarısız olarak ayarlamak olacaktır

Resque.workers.each(&:unregister_worker) 

:

+1

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

cevap

1

başarısız bir iş olarak işaretleyerek olmadan devam eden bir işi durdurma/öldürme gibi hissediyorum, bu kesmek kullanabilirsiniz. Eğer durdurmak bu kod istiyorum Şimdi

class Task 

    @queue = :queue_name 

    def self.perform(parameters) 

     pid = Process.fork do 
      Task.work parameters 
     end 

     #puts "parent, pid #{Process.pid}, waiting on child pid #{pid}" 
     Process.wait 
    end 

    def self.work(parameters) 
     #Your perform code here 
    end 
end 

, sadece şu anda durdurmak istediğiniz iş yapıyor resque işçiye ulaşır. ve çocuğunun çocuk sürecini öldürür. İşçinin torun sürecini öldürmek gibi bir şey.

Açıklama:

Bir işçi çatallar kodunu çalıştırmak hangi gerçekleştirmek fonksiyonu bir çocuk süreç. Bu çocuk sürecini doğrudan öldürürsek, bu iş duracak, ancak başarısız bir iş olarak işaretlenecektir. İşte bu yüzden kendi kendine bir başka çocuk süreci oluşturduk ve şimdi gerçekleştirdiğimiz işi öldürmek, bu işini durduracaktır ve aynı zamanda başarısız olarak işaretlenmeyecektir. Şimdi tekrar işimizi yapabiliriz. Yani, görev durmamız gereken iş yaptığını işçiye nasıl ulaşacağını etmektir Bunu başarmış

UNIX tabanlı sistem için bu kodu yazarak (._ ".):

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 
İlgili konular