如何解决Rails在应用程序启动时仅运行一次作业
我在Rails中有一个轮询作业,它每隔X秒对服务器进行一次ping操作。
我正在使用Sidekiq / Redis执行此后台作业。
我希望从应用程序启动起每X秒执行一次此作业,直到应用程序被杀死为止。每当我再次启动服务器时,我都会清除它的Sidekiq队列并开始新作业
我想把它放在初始化器中 config / initializers / my_app_start.rb
require 'sidekiq/api' # for the case of rails console
module MyAppModule
class Application < Rails::Application
config.after_initialize do
SidekiqProcess.start! unless SidekiqProcess.is_running?
Sidekiq::Queue.new("online_orders").clear
# it calls itself after X seconds in "after_perform" callback
OnlineOrdersJob.perform_later("fetch")
Sidekiq::Queue.new("tunnelin").clear
TunnelinJob.perform_later("reload")
end
end
end
这是我的app / lib / sidekiq.rb
class SidekiqProcess
def self.is_running?
return system("ps aux | grep '[s]idekiq'")
end
def self.start!
system("ruby " + ENV['APP_ROOT'] + "/bin/sidekiq_up.rb &")
end
def self.get_pid
pid = `ps aux | grep sidekiq | grep -v grep | awk '{print $2}'`
if pid.present?
pid = pid.split("\n")[0]
end
return pid
end
def self.stop
pid = self.get_pid
if pid == nil || pid == ""
return "sidekiq pid not found"
end
return system("kill -HUP " + pid)
end
def self.stop!
pid = self.get_pid
if pid == nil || pid == ""
return "sidekiq pid not found"
end
return system("kill -9 " + pid)
end
end
问题是:它正在运行3次。我认为这是因为我的rails服务器配置创建了3个工作程序,每个工作程序将执行所有初始化程序。如何确保初始化程序仅运行一次,而与工作人员人数无关?
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。