有没有办法将额外的参数传递给rufus-scheduler call()或on_pre_trigger()方法?

时间:2016-05-05 14:15:37

标签: ruby-on-rails rufus-scheduler

我正在尝试为我的Rails应用程序配置一组分布式主机的rufus-scheduler。为了确保一次只有一个主机接收一个作业(当服务器进程在所有主机上运行时),我有一个 DatabaseSemaphore 模型,表结构为:

create_table :database_semaphores do |t|
    t.string :name
    t.datetime :locked_at
    t.datetime :unlocked_at
    t.datetime :completed_at
    t.integer  :lock_duration, :default => 30 

    t.timestamps
end

我有 DatabaseSemaphore.open? DatabaseSemaphore.close?方法,这些方法分别为每个作业设置属性值以获取和释放锁定。我在 on_pre_trigger()内的 on_pre_trigger() on_post_trigger()中调用了 DatabaseSemaphore.open?方法,分别。

此处, lock_duration 的默认值为30秒。但是,对于每项工作,它都应该是可以改变的。所以,我打算能够在调度程序块中为它传递一个值,并将其设置为' lock_duration'的值。 on_pre_trigger()中该作业实例的属性。

类似的东西:

scheduler.in '1m', tag: 'hello' do |job|
    job.params = {lock_duration: 20}
    puts "Hello World!"
end

有没有这样做的功能?

1 个答案:

答案 0 :(得分:1)

让我们尝试迭代你真正需要的东西。

  

为此,我想在执行作业之前为每个作业在数据库中设置一些条目

如何简单地做

require 'rufus-scheduler'

scheduler = Rufus::Scheduler.new

scheduler.every '1h' do
  # set entries in db
  2.times { DB[:entries].insert(tstamp: Time.now) }
  # do the job
  p 1 + 1
end

这不完全是“在工作执行之前”,而是“在工作执行开始时”。

<强>更新

  

如果rufus-scheduler的'job'结构可以允许额外的hash作为参数,那就太好了,也许

也许这个例子有帮助:

require 'rufus-scheduler'

s = Rufus::Scheduler.new

s.every '5s', msg: 'hello world' do |job|
  p job.opts
end

s.join

每五秒打印一次“{:msg =&gt;'hello world'}”。

opts下的自述文件中有记录。

您还可以查看handlersco