القضبان / delayed_job - يريدون تحميل أحدث نسخة من الطبقة العمل

StackOverflow https://stackoverflow.com/questions/1609586

سؤال

وأنا باستخدام البرنامج المساعد delayed_job في القضبان للقيام معالجة الخلفية، وأواجه زوبعة في "تطوير رشيقة" لقد تشهد حتى الآن في القضبان ...

وعادة في القضبان لو ضرب خطأ / ترغب في إضافة بعض الوظائف الجديدة - أنا فقط إضافة بعض رمز وتحديث الصفحة ويعمل القانون الجديد

ومع delayed_job، يبدو أن لا يتم إعادة تحميل الطبقة العمل ... إذا فشل المهمة وأذهب وإصلاح الخطأ والنار المهمة مرة أخرى، والقانون القديم يعمل مرة أخرى.

هل هناك أي طريقة لجعل delayed_job تحميل أحدث نسخة من الطبقة العمل قبل تتذرع بها؟

وفقط في حالة هذا له علاقة معها - وأنا أعلم delayed_job لديها عدد قليل من الخيارات المختلفة في سبل للاعلان عن الوظائف / وظائف تشغيل:

وصفي المهمة في الدليل ليب القضبان وأعلنت مثل:

class FooJob < Struct.new(:foo_id)

وأنا استدعاء وظيفة مثل هذا من وحدة تحكم:

Delayed::Job.enqueue(FooJob.new(params[:id]))
هل كانت مفيدة؟

المحلول

وليس هناك شيء مدمج للقيام بذلك. عموما كنت مسؤولا عن إدارة وإعادة العاملين لديك. وربما هذا هو فقط كذلك منذ إعادة تحميل تنمية القضبان جيدة ولكن ليست مثالية، ومحاولة لصناعة السيارات في إعادة تحميل أن تأخر العمل يحتمل أن تصل الى كل القضايا خفية النوع الذي ستكون مبهمة جدا لتصحيح داخل العملية المنفذة. أيضا، إذا كان إعادة تحميل تلقائيا البيئة لكل وظيفة الكثير من حالات الاستخدام سيحصل بطيئة بشكل كبير في وضع ديف.

واقتراحي هو فقط للحصول على استخدام لفعل rake jobs:work ثم Ctrl-C عند إجراء تغييرات. بدلا من ذلك يمكنك إنشاء برنامج نصي فقط أن يدير يدويا الوظائف على أساس مخصص (مأخوذ من delayed_job مستندات ):

#!/usr/bin/env ruby
require File.dirname(__FILE__) + '/../config/environment'

Delayed::Worker.new.start  

نصائح أخرى

وأنا استخدم هذا الإختراق أن طبقات للعمل لطيف جدا، ولكن كن على علم أنه من المحتمل جدا القضبان والإصدار delayed_job محدد لذلك ربما تحتاج إلى تغيير بعض الأشياء. اختبار مع القضبان 3.2.0 وdelayed_job 2.1.4.

ووضع ذلك في مثل script/delayed_job_development وتشغيله من جذورها القضبان.

#!/usr/bin/env ruby

require File.expand_path('../config/environment', File.dirname(__FILE__))
require 'delayed/worker'
require "rails/console/app"

class DummyConsoleClass
  include Rails::ConsoleMethods
end
dummy_console = DummyConsoleClass.new

worker = Delayed::Worker.new({:quiet => false})

puts "Waiting for jobs..."
loop do
  if Delayed::Job.find_available(worker.name).count > 0
    puts "Found jobs"
    dummy_console.reload!
    loop do
      break if worker.work_off.sum == 0
    end
    puts "Done, waiting for jobs..."
  end
  sleep(2)
end

يرجى التعليق إذا كنت تعرف أن هذه فكرة سيئة جدا أو الأشياء أن تكون على علم، وأنا أساسا استخدامه عند تحرير واختبار الوظائف التي تديرها مباشرة وليس مع المهام المجدولة على المدى الطويل في المستقبل.

scroll top