0

メールを配信する必要がある Rails 4.2.0 アプリケーションを作成しています。Queバックグラウンドジョブを管理するための宝石を勧められました。インストールと使用法はここにリストされています。

application.rbまた、次の行で指定しました。

    # For https://github.com/chanks/que
    config.active_record.schema_format = :sql
    config.active_job.queue_adapter = :que

私の仕事は次のようになりますsend_welcome_message.rb

class SendWelcomeEmail < Que::Job
  # Default settings for this job. These are optional - without them, jobs
  # will default to priority 100 and run immediately.
  @priority = 10
  @run_at = proc { 1.minute.from_now }

  def run(user_id, options)

    @user = User.find(user_id)
    UserMailer.welcome_email(@user).deliver_now

    # Destroy the job.
    destroy
  end
end

コマンドを実行するrails sと、コンソールに次のメッセージが表示されます。

{
   "lib":"que",
   "hostname":"...",
   "pid":13938,
   "thread":69925811873800,
   "event":"job_unavailable"
}

そして、コントローラーでこのようにジョブをキューに入れると

SendWelcomeEmail.enqueue 20, priority: 100

ページを更新すると、常に次のエラーが表示されます(メッセージを送信できるにもかかわらず、 que を使用せずに同期する方法です):

    {
   "lib":"que",
   "hostname":"...",
   "pid":13938,
   "thread":69925811873800,
   "event":"job_errored",
   "error":{
      "class":"ArgumentError",
      "message":"wrong number of arguments (1 for 2)"
   },
   "job":{
      "queue":"",
      "priority":100,
      "run_at":"2015-06-22T01:59:45.187+03:00",
      "job_id":11,
      "job_class":"SendWelcomeEmail",
      "args":[
         20
      ],
      "error_count":2
   }
}

rails consoleそして、2 番目のターミナルを開いてそこに入るとQue.worker_states(ここに書かれており、システム内のすべてのワーカーに関する情報が返されるはずです) が表示されます[]

ワーカーが生成されていないと思います。私は正しいですか?そして、それを修正する方法は?

アップデート

que ログにエラーが見つかりました:

wrong number of arguments (1 for 2)
/home/username/train/project/app/jobs/send_welcome_email.rb:8:in `run'
/home/username/.rbenv/versions/2.1.2/lib/ruby/gems/2.1.0/gems/que-0.10.0/lib/que/job.rb:15:in `_run'
/home/username/.rbenv/versions/2.1.2/lib/ruby/gems/2.1.0/gems/que-0.10.0/lib/que/job.rb:99:in `block in work'
/home/username/.rbenv/versions/2.1.2/lib/ruby/gems/2.1.0/gems/que-0.10.0/lib/que/adapters/active_record.rb:5:in `block in checkout'
/home/username/.rbenv/versions/2.1.2/lib/ruby/gems/2.1.0/gems/activerecord-4.2.0/lib/active_record/connection_adapters/abstract/connection_pool.rb:292:in `with_connection'
/home/username/.rbenv/versions/2.1.2/lib/ruby/gems/2.1.0/gems/que-0.10.0/lib/que/adapters/active_record.rb:34:in `checkout_activerecord_adapter'
/home/username/.rbenv/versions/2.1.2/lib/ruby/gems/2.1.0/gems/que-0.10.0/lib/que/adapters/active_record.rb:5:in `checkout'
/home/username/.rbenv/versions/2.1.2/lib/ruby/gems/2.1.0/gems/que-0.10.0/lib/que/job.rb:82:in `work'
/home/username/.rbenv/versions/2.1.2/lib/ruby/gems/2.1.0/gems/que-0.10.0/lib/que/worker.rb:78:in `block in work_loop'
/home/username/.rbenv/versions/2.1.2/lib/ruby/gems/2.1.0/gems/que-0.10.0/lib/que/worker.rb:73:in `loop'
/home/username/.rbenv/versions/2.1.2/lib/ruby/gems/2.1.0/gems/que-0.10.0/lib/que/worker.rb:73:in `work_loop'
/home/username/.rbenv/versions/2.1.2/lib/ruby/gems/2.1.0/gems/que-0.10.0/lib/que/worker.rb:17:in `block in initialize'

8 行目は次のとおりです。

def run(user_id, options)

解決

今、その作業。アダプター構成を削除しましたapplication.rb

SendWelcomeEmail.enqueue 20, priority: 100

書きました

@user = User.find(20)
SendWelcomeEmail.enqueue  @user.id, :priority => 100

これで動作します。2 番目のバリアントで面白いことに、同じ値が関数に渡されます。それでもエラーメッセージには、run引数が1つしか取得されていないことが示されています - 20

4

1 に答える 1

0

gem を読むと、メソッドがキーワードを特別なケースとして扱っqueているように見えます: https://github.com/chanks/que/blob/master/lib/que/job.rb#L31enqueuepriority

したがって、runメソッドには最初の引数のみが渡されます。priorityキーワードは に飲み込まれますque

runメソッドを次のように変更する

  def run(user_id)

問題を解決する必要があります。

于 2015-06-22T07:17:10.963 に答える