如何在Ruby-on-Rails中运行循环后台进程?

时间:2015-12-07 10:08:31

标签: ruby-on-rails ruby

我有一些方法适用于第三方应用的API。按钮点击执行此操作没有问题,但它应该是永久性过程。

如何运行它们的背景?以及如何暂停循环以使其他工作使用相同的API并在作业完成后恢复循环。

现在我读到了ActiveJob,但它只有时间依赖...

更新

我尝试使用wheneversidekiq进行任务运行,但它什么也没做。在哪里查找我无法理解的日志。

**schedule.rb**

every 1.minute do
  runner "UpdateWorker.perform_async"
end

**update_worker.rb**

    class UpdateWorker
      include Sidekiq::Worker
      include CommonMods

      def perform
        logger.info "Things are happening."
        logger.debug "Here's some info: #{hash.inspect}"
        myMethod
      end
      def myMethod
            ....
            ....
            ....
      end
   end

这不是我需要的,但更好的是什么。有人可以用例子解释我吗?

更新2 使用代码进行操作后,必须重新启动 sidekiq 。这个问题解决了,但我不确定这是最好的方法。

4 个答案:

答案 0 :(得分:0)

有几个图书馆可以定期安排工作。例如,您可以使用sidekiq-cron每分钟运行一次作业。

如果要暂停一段时间,可以在某处设置一个标志(Redis / database / file),并在检测到时暂停执行。

在某种程度上相关的说明:不要使用sidetiq。这真的很棒,但它不再维护,并且与当前的Sidekiq版本不兼容。

答案 1 :(得分:0)

在检查一些表明它应该的标志之后,在作业完成后,在ensure部分中排队下一次执行。

另外我建议在那里添加一些延迟,这样你就不会在作业中的某些错误上结束死循环

答案 2 :(得分:0)

您可以定义一个排队的作业:

nan

答案 3 :(得分:0)

我不知道ActiveJobs,但我可以推荐whenever gem来创建cron(定期背景)作业。基本上你最终写了rake个任务。像这样:

desc 'send digest email'
 task send_digest_email: :environment do
  # ... set options if any
  UserMailer.digest_email_update(options).deliver!
end

我从未向自己添加过rake任务,但是为了重复处理你可以这样做(从这个特定问题的答案)

Rake::Task["send_digest_email"].execute