如何使用rails中的gem

时间:2016-06-21 08:34:57

标签: ruby-on-rails ruby ruby-on-rails-3

我试图每隔20秒就开一份工作。我每当宝石都在使用 但根据其文件,它至少允许1分钟的时间。

调度

every 1.minute do
  runner "DailyNotificationChecker.send_notifications"
end

工作

我以为我可以进行无限循环并使用睡眠方法让它睡20秒。这样,这项工作将每20秒运行一次,但如果我的cron再次采用这种方法将会发生什么。

class DailyNotificationChecker 
    def self.send_notifications
        Rails.logger.info "Triggered NotificationChecker"
        if RUN_SCHEDULER == "true"
          Rails.logger.info "Running Performer"
          notes = Note.unprocessed
          if notes.present?
            notes.each do |note|
              RealtimeNotificationChecker.performer(note.user_id,"note_created")
              note_hash = {}
              note_hash[:note_id] = note.id
              url = URI.parse(PROCESS_NOTE_API_URL)
              resp, data = Net::HTTP.post_form(url, note_hash)
            end
          end
        sleep 20  #=> workaround for to sleep 20 seconds
        end
      end
end

2 个答案:

答案 0 :(得分:3)

有几种方法可以解决这个问题:

  1. 接受每分钟粒度限制whenever(即cron个作业),并且每分钟运行一次此任务,无需循环。
  2. 将您的脚本作为daemonised服务运行;根本不要使用whenever。您可以使用类似monit的内容来确保脚本不会无声地死亡。
  3. 重构您的代码,而不是在每次Notification创建时触发新的后台作业。使用delayed_jobsidekiqresque等工具来处理工作量。

答案 1 :(得分:0)

考虑到我的情况,我已经解决了代码

strace

我正在运行一个循环,每59秒就会过期,并在循环内睡20秒。