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 (将#修改为@)