我正在尝试为我的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
有没有这样做的功能?
答案 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下的自述文件中有记录。