2013-11-20 9 views
8

मेरे Resque कार्यकर्ता वर्ग को रोकने के लिएResque रोजगार, कैसे चल रहा है काम

class WebWorker 

    @queue = :jobs_queue 

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

मैं कतार से इस

Resque.dequeue(WebWorker,id) 

की तरह एक निश्चित कार्य निकालने लेकिन मैं काम और पुन: प्रारंभ चलना बंद करना चाहते हैं , यह मैं कैसे करूंगा?

Resque.workers.each(&:unregister_worker) 

यह आदेश काम बंद करो और यह सेट के रूप में विफल होगा:

+1

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

उत्तर

1

आप एक असफल काम के रूप में यह अंकन के बिना की मौत हो गई/चल रहे एक काम रोक की तरह महसूस करते हैं, तो आप इस हैक का उपयोग कर सकते हैं।

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 

अब, जहां आप अपने बंद इस कोड को चाहते हैं, बस वर्तमान में काम जो आप बंद करना चाहते कर resque कार्यकर्ता तक पहुँचने। और अपने बच्चे की बाल प्रक्रिया को मार डालो। श्रमिक की पोते की प्रक्रिया को मारने की तरह कुछ।

स्पष्टीकरण:

एक कार्यकर्ता कांटे एक बच्चे प्रक्रिया है जिसके प्रदर्शन समारोह में अपनी कोड चलाते हैं। अगर हम सीधे इस बच्चे की प्रक्रिया को मार देते हैं, तो यह नौकरी रुक जाएगी लेकिन इसे असफल नौकरी के रूप में चिह्नित किया जाएगा। यही कारण है कि हमने स्वयं में एक और बाल प्रक्रिया को फोर्क किया है। अब प्रदर्शन की बाल प्रक्रिया को मारने से यह चल रही नौकरी बंद हो जाएगी और इसे असफल के रूप में चिह्नित नहीं किया जाएगा। अब हम नौकरी को फिर से लगा सकते हैं।

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 
: तो, काम के लिए एक यूनिक्स आधारित प्रणाली के लिए इस कोड को लिख कर कैसे कर्मी को कार्य है कि हम रोकने की आवश्यकता कर तक पहुँचने के लिए है

मैं यह करने में कामयाब रहे (._ "।)

संबंधित मुद्दे