创建周期性活动作业失败
create recurring activejob fails
我正在尝试在 rails 4.2 中创建一个以正常速率运行的 ActiveJob。作业是第一次被调用,但不会再次启动。我的代码在尝试调用 perform_later.
后抛出异常
日志输出
[ActiveJob] Enqueued ProcessInboxJob (Job ID: 76a63689-e330-47a1-af92-8e4838b508ae) to Inline(default)
[ActiveJob] [ProcessInboxJob] [76a63689-e330-47a1-af92-8e4838b508ae] Performing ProcessInboxJob from Inline(default)
ProcessInboxJob running...
[ActiveJob] [ProcessInboxJob] [76a63689-e330-47a1-af92-8e4838b508ae] [AWS S3 200 0.358441 0 retries] list_objects(:bucket_name=>"...",:max_keys=>1000)
[ActiveJob] [ProcessInboxJob] [76a63689-e330-47a1-af92-8e4838b508ae] Enqueued ProcessInboxJob (Job ID: dfd3dd7a-06ab-4dba-9bbf-ce1ad606f7e5) to Inline(default) with arguments: {:wait=>30 seconds}
[ActiveJob] [ProcessInboxJob] [76a63689-e330-47a1-af92-8e4838b508ae] Performed ProcessInboxJob from Inline(default) in 599.72ms
Exiting
/Users/antarrbyrd/.rbenv/versions/2.1.2/lib/ruby/gems/2.1.0/gems/activejob-4.2.0/lib/active_job/arguments.rb:60:in `serialize_argument': Unsupported argument type: ActiveSupport::Duration (ActiveJob::SerializationError)
process_inbox_job.rb
class ProcessInboxJob < ActiveJob::Base
queue_as :default
#FREQUENCY = 3.minutes
def perform()
# do some work
end
# reschedule job
after_perform do |job|
self.class.perform_later(wait: 30.seconds)
end
end
语法为self.class.set(等待:30.seconds)。perform_later。但这不是一种可靠的方法,就好像链中断发生异常一样。您还必须安排初始作业。
如果你使用 resque 你可以使用 https://rubygems.org/gems/activejob-scheduler
正如@bcd 所说,您必须将 self.class.set(wait: 30.seconds).perform_later
与支持排队的队列适配器一起使用,即不是默认(内联)适配器。
我post就改期的问题给出不同的观点,希望对以后的读者有所帮助。
如果引发异常,after_perform
将不会被调用,但这确实 not 使它成为重新安排工作的糟糕地方。如果你在工作中遇到异常,最好挽救它(使用 class 方法 rescue_from
),如果你的后端还没有这样做,就给自己发送一个通知。
然后您可以尝试修复问题(在数据或代码中)并重试(如果可以)或再次将类似的作业加入队列。
对于调度部分,activejob-scheduler 非常棒,不仅适用于 resque,而且也有一些缺点。
它使用 rufus-scheduler,它执行内存延迟,因此每当您的服务器重新启动时,您将丢失所有调度信息,这对于某些任务来说可能确实是个问题(我将任务安排在未来 1 个月和每周更新我的应用程序,这意味着每次都要重新启动)。
您还会失去使用实际排队后端的所有优势,例如 beantalk with backburner。
ActiveJob-scheduler 还声称在正确的时间执行作业,这是错误的。 ActiveJob 适配器 运行s 在指定的时间,但根据您的设置,实际执行作业可能需要一些时间,例如当您 运行 在另一台服务器上工作时。
最后,对于初始调度,您可以包含一个代码,用于检查工作程序启动时作业是否存在,并在需要时进行调度。
综上所述,
是的,ActiveJob-Scheduler 很棒,但是您会失去一些 ActiveJob 功能,而且它不能完成所有事情。
根据您使用的排队系统,您可以尝试 https://github.com/codez/delayed_cron_job or https://github.com/ondrejbartas/sidekiq-cron。使用 DJ cron,您可以像 rails_admin 一样使用 UI 来实际编辑 cron 正则表达式。 Sidekiq-cron 为您提供 Sinatra web UI,您可以在其中手动开始或暂停作业。
我正在尝试在 rails 4.2 中创建一个以正常速率运行的 ActiveJob。作业是第一次被调用,但不会再次启动。我的代码在尝试调用 perform_later.
后抛出异常日志输出
[ActiveJob] Enqueued ProcessInboxJob (Job ID: 76a63689-e330-47a1-af92-8e4838b508ae) to Inline(default)
[ActiveJob] [ProcessInboxJob] [76a63689-e330-47a1-af92-8e4838b508ae] Performing ProcessInboxJob from Inline(default)
ProcessInboxJob running...
[ActiveJob] [ProcessInboxJob] [76a63689-e330-47a1-af92-8e4838b508ae] [AWS S3 200 0.358441 0 retries] list_objects(:bucket_name=>"...",:max_keys=>1000)
[ActiveJob] [ProcessInboxJob] [76a63689-e330-47a1-af92-8e4838b508ae] Enqueued ProcessInboxJob (Job ID: dfd3dd7a-06ab-4dba-9bbf-ce1ad606f7e5) to Inline(default) with arguments: {:wait=>30 seconds}
[ActiveJob] [ProcessInboxJob] [76a63689-e330-47a1-af92-8e4838b508ae] Performed ProcessInboxJob from Inline(default) in 599.72ms
Exiting
/Users/antarrbyrd/.rbenv/versions/2.1.2/lib/ruby/gems/2.1.0/gems/activejob-4.2.0/lib/active_job/arguments.rb:60:in `serialize_argument': Unsupported argument type: ActiveSupport::Duration (ActiveJob::SerializationError)
process_inbox_job.rb
class ProcessInboxJob < ActiveJob::Base
queue_as :default
#FREQUENCY = 3.minutes
def perform()
# do some work
end
# reschedule job
after_perform do |job|
self.class.perform_later(wait: 30.seconds)
end
end
语法为self.class.set(等待:30.seconds)。perform_later。但这不是一种可靠的方法,就好像链中断发生异常一样。您还必须安排初始作业。 如果你使用 resque 你可以使用 https://rubygems.org/gems/activejob-scheduler
正如@bcd 所说,您必须将 self.class.set(wait: 30.seconds).perform_later
与支持排队的队列适配器一起使用,即不是默认(内联)适配器。
我post就改期的问题给出不同的观点,希望对以后的读者有所帮助。
如果引发异常,after_perform
将不会被调用,但这确实 not 使它成为重新安排工作的糟糕地方。如果你在工作中遇到异常,最好挽救它(使用 class 方法 rescue_from
),如果你的后端还没有这样做,就给自己发送一个通知。
然后您可以尝试修复问题(在数据或代码中)并重试(如果可以)或再次将类似的作业加入队列。
对于调度部分,activejob-scheduler 非常棒,不仅适用于 resque,而且也有一些缺点。
它使用 rufus-scheduler,它执行内存延迟,因此每当您的服务器重新启动时,您将丢失所有调度信息,这对于某些任务来说可能确实是个问题(我将任务安排在未来 1 个月和每周更新我的应用程序,这意味着每次都要重新启动)。
您还会失去使用实际排队后端的所有优势,例如 beantalk with backburner。
ActiveJob-scheduler 还声称在正确的时间执行作业,这是错误的。 ActiveJob 适配器 运行s 在指定的时间,但根据您的设置,实际执行作业可能需要一些时间,例如当您 运行 在另一台服务器上工作时。
最后,对于初始调度,您可以包含一个代码,用于检查工作程序启动时作业是否存在,并在需要时进行调度。
综上所述,
是的,ActiveJob-Scheduler 很棒,但是您会失去一些 ActiveJob 功能,而且它不能完成所有事情。
根据您使用的排队系统,您可以尝试 https://github.com/codez/delayed_cron_job or https://github.com/ondrejbartas/sidekiq-cron。使用 DJ cron,您可以像 rails_admin 一样使用 UI 来实际编辑 cron 正则表达式。 Sidekiq-cron 为您提供 Sinatra web UI,您可以在其中手动开始或暂停作业。