9

Rails 4.2 でスケジュールされたジョブを動作させることができた人はいますか?

私は resque を使用しており、resque-scheduler を使用してジョブをスケジュールしようとしています。ロードされてスケジューラが実行されるスケジュールがあり、ジョブを実行しているように見えますが、何もしません。

resque-scheduler: [INFO] 2014-09-16T01:54:25-07:00: Starting
resque-scheduler: [INFO] 2014-09-16T01:54:25-07:00: Loading Schedule
resque-scheduler: [INFO] 2014-09-16T01:54:25-07:00: Scheduling friends 
resque-scheduler: [INFO] 2014-09-16T01:54:25-07:00: Schedules Loaded
resque-scheduler: [INFO] 2014-09-16T01:54:55-07:00: queueing FriendsJob (friends)

このようなジョブをキューに入れることができ、それらは処理されます。

TestJob.enqueue(params[:id])

そして、この出力をワーカーログに取得します

got: (Job{default} | ActiveJob::QueueAdapters::ResqueAdapter::JobWrapper | ["TestJob", "98732ce5-17f7-4da3-9a03-a5d2f8f74e84", "8"])
** [01:24:01 2014-09-16] 54841: resque-1.25.2: Processing default since 1410855841  [ActiveJob::QueueAdapters::ResqueAdapter::JobWrapper]
** [01:24:01 2014-09-16] 54841: Running before_fork hooks with [(Job{default} | ActiveJob::QueueAdapters::ResqueAdapter::JobWrapper | ["TestJob", "98732ce5-17f7-4da3-9a03-a5d2f8f74e84", "8"])]
** [01:24:01 2014-09-16] 54841: resque-1.25.2: Forked 54882 at 1410855841
** [01:24:01 2014-09-16] 54882: Running after_fork hooks with [(Job{default} | ActiveJob::QueueAdapters::ResqueAdapter::JobWrapper | ["TestJob", "98732ce5-17f7-4da3-9a03-a5d2f8f74e84", "8"])]
Hello World!!
** [01:24:01 2014-09-16] 54882: done: (Job{default} | ActiveJob::QueueAdapters::ResqueAdapter::JobWrapper | ["TestJob", "98732ce5-17f7-4da3-9a03-a5d2f8f74e84", "8"])

しかし、ジョブをスケジュールしようとすると、エンキューされているように見えますが、何もしていません。

これがschedule.ymlです

friends:
  every: "30s"
  queue: "friends"
  class: "FriendsJob"
  args: 8
  description: "Friends jobs scheduler"

スケジュールされたジョブからの出力は次のとおりです。

** [01:23:36 2014-09-16] 54841: got: (Job{friends} | FriendsJob | [8])
** [01:23:36 2014-09-16] 54841: resque-1.25.2: Processing friends since 1410855816 [FriendsJob]
** [01:23:36 2014-09-16] 54841: Running before_fork hooks with [(Job{friends} | FriendsJob | [8])]
** [01:23:36 2014-09-16] 54841: resque-1.25.2: Forked 54880 at 1410855816
** [01:23:36 2014-09-16] 54880: Running after_fork hooks with [(Job{friends} | FriendsJob | [8])]
** [01:23:36 2014-09-16] 54880: done: (Job{friends} | FriendsJob | [8])

このhttp://dev.mikamai.com/post/96343027199/rails-4-2-new-gems-active-job-and-global-id を読んだ後、ActiveJob と GlobalId に関係があるのではないかと疑っています。

エンキューされた違いを見てください

** [01:24:01 2014-09-16] 54841: Running before_fork hooks with [(Job{default} | ActiveJob::QueueAdapters::ResqueAdapter::JobWrapper | ["TestJob", "98732ce5-17f7-4da3-9a03-a5d2f8f74e84", "8"])]

対予定

** [01:23:36 2014-09-16] 54841: Running before_fork hooks with [(Job{friends} | FriendsJob | [8])]

ジョブ自体は次の方法で生成されました

 rails g job <JobName>

それらは次のようになります。

class TestJob < ActiveJob::Base
  queue_as :default
  def perform(friend_id)
    friend = Friend.find(friend_id)
    name = friend.name.swapcase
    puts "Hello World!!"
  end
end


class FriendsJob < ActiveJob::Base
  queue_as :friends
  def perform(friend_id)
    friend = Friend.find(friend_id)
    name = friend.name.swapcase
    puts "Hello World!!"
  end
end

これに関するヘルプは大歓迎です。事前に感謝します。

********* アップデート *********

action_job railtie を削除し、Resque と Resque-Scheduler のみを使用しており、スケジュールされたジョブは現在機能しています。したがって、これは ActionJob/GlobalId に関連しているようです。Rails プロジェクトでイシューをオープンしました。うまくいけば、彼らはすぐにそれを修正します。

****** 2 回目の更新 ********* これに関する最新情報を入手しました。ActiveJob コードベースで働く Cristianbica 氏は、次のように述べています。「これまでのところ、定期的なジョブについては考えていませんでした。これをサポートしていないのは、外部の gem なしでこれをサポートしているアダプターがないためです。しかし、これは非常に優れた機能ですが、ジョブに間に合うとは思えません。 4.2. また、レールに含めるのに適しているかどうかもわかりません"

4

3 に答える 3

5

https://github.com/JustinAiken/active_schedulerは、一方を他方にラップする gem です。

于 2015-03-19T21:31:14.040 に答える
2

更新: 4/4/16 - 以下の回答は Rails の現在のバージョンでも正しいですが、上記の回答で述べたように Justin によって作成された active_scheduler gem を使用するようになりました: https://stackoverflow.com/a/29155372/ 1299792

元の回答: 定期的なジョブをスケジュールする必要がある場合は、ActiveJob を使用しないでください。

ルイスが提起した問題から

現在、ActiveJob で定期的なジョブをサポートしていないため、これを終了します。定期的なジョブをサポートできる場合は、これを別の宝石として、または Rails 5 で見ています。機能のリクエストとそれらに関する話は、通常、メーリング リスト ( https://groups.google.com/forum/#!forum ) で行われます。 /rubyonrails-core )。あなたの問題@luismadrigalの解決策として、 resque-scheduler の方法を使用して定期的なジョブを実行することをお勧めします。

https://github.com/rails/rails/issues/16933#issuecomment-58945932

メーリング リストでgem を作成するという話がありましたが、それ以上の情報は見つかりません。

于 2015-02-25T02:47:45.833 に答える