0

我正在使用 Resque 和 Resque Schedule 来启动必须在应用程序启动时立即运行的作业。其他计划的作业每 30 秒加载一次。

这是我的 config/initializers/redis.rb 的代码

require 'rake'
require 'resque'
require 'resque/server'
require 'resque_scheduler/tasks'
# This will make the tabs show up.
require 'resque_scheduler'
require 'resque_scheduler/server'

uri = URI.parse(ENV["REDISTOGO_URL"])
REDIS = Redis.new(:host => uri.host, :port => uri.port, :password => uri.password)
Resque.redis = REDIS
Dir["#{Rails.root}/app/workers/*.rb"].each { |file| require file }
Resque.enqueue(AllMessageRetriever)
Resque.schedule = YAML.load_file(Rails.root.join('config', 'schedule.yml'))

当应用程序启动时,AllMessageRetriever 会运行 2-3 次而不是只运行一次。初始化器是否被多次调用?这发生在 Heroku 和我的本地环境中?

是否可以在 Resque-Scheduler 中设置一个延迟作业,它只会在运行时立即执行一次?

AllMessageRetriever 的代码。基本上,它遍历一个表并调用外部 API 来获取数据,然后将其更新到表中。如果我在初始化文件中添加入队方法,整个任务会发生 2-3 次

 require 'socialcast'
module AllMessageRetriever
    @queue = :message_queue
    def self.perform()
        Watchedgroup.all.each do |group|    
            puts "Running group #{group.name}"
            continueLoading=true
            page=1
            per_page=500
            while(continueLoading == true)
                User.first.refresh_token_if_expired
                token = User.first.token
                puts "ContinueLoading: #{continueLoading}"
                @test = Socialcast.get_all_messages(group.name,token,page,per_page)

                messagesArray =  ActiveSupport::JSON.decode(@test)["messages"]
                puts "Message Count: #{messagesArray.count}"
                if messagesArray.count == 0
                    puts 'count is zero now'
                    continueLoading = false
                else
                    messagesArray.each do |message|
                        if not Message.exists?(message["id"])   
                            Message.create_with_socialcast(message, group.id)
                        else
                            Message.update_with_socialcast(message)
                        end
                    end
                end
                page += 1
            end
            Resqueaudit.create({:watchedgroup_id => group.id,:timecompleted => DateTime.now})
        end
        # Do anything here, like access models, etc
        puts "Doing my job"
    end
end
4

1 回答 1

2

首先,你为什么要在 init 上排队?

您最好委派一个从初始化程序调用的rake 任务。

这将消除对初始化过程的依赖,这应该会清理很多东西。我不会把它放在初始化程序本身中,因为它会在其他地方得到更好的处理(模块化


问题

我认为这条线导致了这个问题:

Resque.enqueue(AllMessageRetriever)

没有看到 的内容AllMessageRetriever,我推测您AllMessageRetriever(模块/类?)将返回 2/3 次结果,导致 Resque 将(2 / 3 次)数据集添加到队列中

可能是错的,但这是有道理的,这意味着您的问题不在于Resque/ Initializers,而在于您的AllMessageRetriever班级

如果你展示它会是一个很大的帮助!

于 2014-02-23T12:58:46.590 回答