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 项目中打开了一个问题。希望他们能尽快修复它。

****** 第二次更新 ********* 我得到了这方面的更新。在 ActiveJob 代码库工作的 Cristianbica 这么说。“到目前为止,我们还没有考虑过重复工作,我们不支持这个,因为没有外部 gem 的适配器都不支持这个。然而,这是一个非常好的功能,但我认为我们无法及时实现4.2. 另外我不确定它是否适合包含在 rails 中”

4

3 回答 3

5

https://github.com/JustinAiken/active_scheduler是将一个包裹到另一个的宝石

于 2015-03-19T21:31:14.040 回答
2

更新:2016 年 4 月 4 日 - 虽然以下答案对于当前版本的 Rails 仍然正确,但我现在使用 Justin 创建的 active_scheduler gem,如上面的答案中所述:https ://stackoverflow.com/a/29155372/ 1299792

原始答案:如果您需要安排重复作业,请避免使用 ActiveJob。

路易斯提出的问题

由于我们目前不支持 ActiveJob 的重复作业,因此我们将关闭它。如果可以支持重复性工作,我将其视为单独的 gem 或在 rails 5 中。功能请求和围绕它们的讨论通常在邮件列表中讨论(https://groups.google.com/forum/#!forum /rubyonrails-核心)。作为您的问题@luismadrigal 的解决方案,我建议您使用 resque-scheduler 方式来执行重复性工作。

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

有人谈论在邮件列表中创建一个 gem,但我找不到任何关于它的更多信息。

于 2015-02-25T02:47:45.833 回答
1

似乎resque-scheduler不支持Rails 4.2 中的 ActiveJob。因此,作业没有正确安排,这解释了当使用 ActiveJob API 和 resque-scheduler 将作业排入队列时日志中的差异。

为了解决这个问题,我们应该找到一种在 ActiveJob 包装器中安排作业的方法:

ActiveJob::QueueAdapters::ResqueAdapter::JobWrapper

Resque-scheduler 提供了支持默认不支持的扩展的方法。为此,我们应该扩展自定义作业类以支持该#scheduled方法。这样我们就可以使用 ActiveJob API 手动排队作业。

最简单的方法是在基础作业中编写通用代码方法,然后从中扩展所有作业:

# custom base job
class Job < ActiveJob::Base

    # method called by resque-scheduler to enqueue job in a queue
    def self.scheduled(queue, klass, *args)

        # create the job instance and pass the arguments
        job = self.job_or_instantiate(*args)

        # set correct queue
        job.queue_name = queue

        # enqueue job using ActiveJob API
        job.enqueue
    end
end

JobReque-scheduler 将调用此方法来调度从类扩展的每个作业。这样,作业将在 ActiveJob 包装器中排队。结果将与调用相同MyJob.perform_later(*args)

于 2018-01-31T21:14:58.057 回答