2

Rails アプリで Resque (および resque-scheduler) を使用して定期的なジョブを実行しています。今日まで、これは私にとってはうまくいきました。私は無関係だと思っていたいくつかのコード変更を行いましたが、今ではすべてのワーカーが実行メソッドに入る前に失敗します (デバッグ ステートメントでチェック)。Railsコンソールで実行すると、同じワーカーメソッドが正常に機能します。開発用ローカルホスト (Postgres DB) での resque 経由でのみ失敗します。

失敗したワーカーの resque コンソールに表示されるエラーは次のとおりです。

Exception
    NoMethodError
Error
    undefined method `write' for nil:NilClass

エラーの追加のスタック トレースはありません。なぜこれが失敗しているのか分かりますか?

追加情報:

lib/タスク/resque.rake

# Resque tasks
require 'resque/tasks'
require 'resque_scheduler/tasks'

namespace :resque do
  task :setup do
    require 'resque'
    require 'resque_scheduler'
    require 'resque/scheduler'

    # you probably already have this somewhere
    Resque.redis = 'localhost:6379'

    # If you want to be able to dynamically change the schedule,
    # uncomment this line.  A dynamic schedule can be updated via the
    # Resque::Scheduler.set_schedule (and remove_schedule) methods.
    # When dynamic is set to true, the scheduler process looks for
    # schedule changes and applies them on the fly.
    # Note: This feature is only available in >=2.0.0.
    #Resque::Scheduler.dynamic = true

    # The schedule doesn't need to be stored in a YAML, it just needs to
    # be a hash.  YAML is usually the easiest.
    Resque.schedule = YAML.load_file("#{Rails.root}/config/resque_schedule.yml")

    # If your schedule already has +queue+ set for each job, you don't
    # need to require your jobs.  This can be an advantage since it's
    # less code that resque-scheduler needs to know about. But in a small
    # project, it's usually easier to just include you job classes here.
    # So, something like this:
    # require 'jobs'
  end
end

task "resque:setup" => :environment do
  #ENV['QUEUE'] = '*'

  Resque.before_fork = Proc.new { ActiveRecord::Base.establish_connection }
end

config/resque.yml

development: localhost:6379
test: localhost:6379:1
staging: redis1.se.github.com:6379
fi: localhost:6379
production: redis1.ae.github.com:6379

初期化子/ resque.rb

rails_root = Rails.root || File.dirname(__FILE__) + '/../..'
rails_env = Rails.env || 'development'

resque_config = YAML.load_file(rails_root.to_s + '/config/resque.yml')
Resque.redis = resque_config[rails_env]

# This will make the tabs show up.
require 'resque_scheduler'
require 'resque_scheduler/server'

config/resque_schedule.yml

populate_game_data:
  # you can use rufus-scheduler "every" syntax in place of cron if you prefer
  every: 1m
  # By default the job name (hash key) will be taken as worker class name.
  # If you want to have a different job name and class name, provide the 'class' option
  class: PopulateDataWorker
  queue: high
  args:
  description: "This job populates the game and data"

上記のファイルは、動作状態と非動作状態の間で変更されていないことに注意してください。

4

1 に答える 1

4

今朝同じ問題が発生し、New Relic による gem の更新に突き止めました。newrelic_rpm のバージョン 3.5.6.46 は ruby​​gems でヤンクされていましたが、バンドル アップデートでなぜかインストールされました。

それらはまだ 3.5.6 のベータ トラックにあり、Resque でいくつかの問題がありました。https://github.com/newrelic/rpm/commit/e81889c2bce97574ec682dafee12015e13ccb2e1を参照してください。

修正は、newrelic_rpm の Gemfile に「~> 3.5.5.38」を追加することでした。

于 2013-01-25T10:42:16.117 に答える