Resque задания, как остановить выполнение задания

мой рабочий класс Resque

class WebWorker

  @queue = :jobs_queue

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

Я удаляю из очереди определенное задание, подобное этому

Resque.dequeue(WebWorker,id)

но я хотел бы остановить выполнение задания и перезапустить, как бы я это сделал?

2 ответов


попробовать unregister_worker следующим образом:

Resque.workers.each(&:unregister_worker)

эта команда остановит работу и не удалось.

http://www.rubydoc.info/gems/resque/Resque/Worker:unregister_worker


Если вам хочется убить / остановить текущую работу, не помечая ее как неудачную работу, вы можете использовать этот хак.

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, который в настоящее время выполняет работу, которую вы хотите остановить. и убить его детский процесс. Что-то вроде убийства внука рабочего.

объяснение:

рабочий разветвляет дочерний процесс, в котором функция perform запускает свой код. Если мы непосредственно убить этот дочерний процесс, то это задание остановится, но он будет отмечен как неудачное задание. Вот почему мы раздвоили в себе еще один детский процесс.выполните и теперь убийство дочернего процесса perform остановит это запущенное задание, а также оно не будет помечено как неудачное. Теперь мы можем снова расспросить о работе. Итак, задача состоит в том, как добраться до работника, выполняющего работу, которую нам нужно остановить (._.")

мне удалось сделать это, написав этот код для системы на основе 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