문제

Rails에서 Delayed_Job 플러그인을 사용하여 백그라운드 처리를 수행하고 있으며, 지금까지 레일에서 경험 한 'Agile Development'에서 딸꾹질을 경험하고 있습니다.

일반적으로 오류를 누르거나 새로운 기능을 추가하려면 레일로 표시됩니다. 코드를 추가하고 페이지를 새로 고치고 새 코드가 실행됩니다.

Delayed_job을 사용하면 작업 클래스가 다시로드되지 않는 것 같습니다 ... 작업이 실패하고 오류를 고치고 작업을 다시 해고하면 이전 코드가 다시 실행됩니다.

Delayed_Job을 호출하기 전에 최신 버전의 작업 클래스를로드 할 수있는 방법이 있습니까?

이것이 그것과 관련이있는 경우를 대비하여 - Delayed_job은 작업 / 실행 작업을 선언하는 방법에 몇 가지 다른 옵션이 있다는 것을 알고 있습니다.

내 직업 수업은 레일의 LIB 디렉토리에 있으며 다음과 같이 선언됩니다.

class FooJob < Struct.new(:foo_id)

그리고 저는 컨트롤러에서 이와 같은 작업을 호출하고 있습니다.

Delayed::Job.enqueue(FooJob.new(params[:id]))
도움이 되었습니까?

해결책

이것을 할 수있는 것은 없습니다. 일반적으로 귀하는 근로자를 관리하고 다시로드 할 책임이 있습니다. Rails Development Reloading이 좋지만 완벽하지는 않지만 지연된 작업을 자동으로 고정하려고 시도하면 작업자 프로세스 내부에서 디버깅 할 수있는 모든 종류의 미묘한 문제가 발생할 수 있기 때문에 이것은 아마도 마찬가지입니다. 또한 모든 작업에 대해 환경을 자동으로 다시로드하면 많은 사용 사례가 개발 모드에서 엄청나게 느려집니다.

내 제안은 단지 일을하는 데 사용하는 것입니다 rake jobs:work 그리고 Ctrl-C 변경할 때. 또는, 당신은 임시로 작업을 수동으로 실행하는 스크립트를 만들 수 있습니다 ( Delayed_job 문서):

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

Delayed::Worker.new.start  

다른 팁

나는이 핵을 사용하여 이음새를 사용하여 매우 멋지게 작동하지만, 아마도 매우 레일과 Delayed_job 버전이 특정 일 수 있으므로 일부를 변경해야 할 것입니다. Rails 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

이것이 매우 나쁜 생각이거나 알아야 할 사항이라는 것을 알고 있다면, 주로 미래에 오랫동안 실행될 예정이 아닌 작업을 수행하지 않는 작업을 편집하고 테스트 할 때 주로 사용합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top