2016-12-02 58 views
0

我目前在Ruby中使用我的应用程序启用队列。我用sidekiq并有定义如下工人类:Sidekiq和红宝石中的排队

class Worker 
    include Sidekiq::Worker 

    def perform(params) 
    sleep 10 
    @@logger.info("--------------------------") 
    @@logger.info("Request received") 
    @@logger.info("--------------------------") 
    end 
end 

我从我的主入口点调用它称为“api.rb”

post '/receive/?' do 
    @@logger.debug("/retrieve endpoint received") 
    Worker.perform_async @params 
end 

这个工作的罚款,每次的睡眠完成后,下一个排队的任务开始。

在我的情况下,我需要排队或开始下一个排队的项目,只有当我决定。它将由外部事件触发。在我的 'api.rb'

,我已经加入:

post '/response/?' do 
    next_task 
end 

代码工作的方式是 '/接收' 可排队10个请求。第一个请求会触发一个特定的动作(发送一个post命令给服务器)。

我希望远程服务器通过“/ response”向我发送请求,告诉我该操作已完成。当收到此响应时,我使用'next_task'api删除正在运行并且现在已完成的前一个任务,并移至下一个排队的任务。

任何想法,如何创建一个自定义触发器来排队和开始新的工作。是否有信号让我避免sidekiq框架去队列,直到我发送一个特定的信号。

的Merci

回答

0

要删除的Sidekiq队列中的作业,你将不得不遍历整个队列。这不是队列的惯用用法。

恐怕我不明白你到底想要做什么。只要记住,你可以存储状态Sidekiq队列之外,例如,你可以有对工作的典范:

post '/receive/?' do 
    job = Job.create(@params) 
    Worker.perform_in(10.seconds) 
end 

,然后在工作人员:

def perform 
    job = Job.find_oldest_unexecuted  
    if job 
    job.execute! 
    else 
    # wait another 10 seconds 
    Worker.perform_in(10.seconds) 
    end 
end 

而且在工作:

class Job < ActiveRecord::Base 
    def self.find_oldest_unexecuted 
    where(executed_at: nil).order(:id).first 
    end 
    def execute! 
    # do what needs to be done here 
    update_attribute(:executed_at, Time.zone.now) 
    end 
end 
+0

我想要做的是控制下一份工作的开始。默认情况下,当前一个完成时,队列会自动启动一个新的作业。就我而言,我只需要求职时就开始下一个工作,因为工作是在远程服务器上完成的,而且我无法控制远程任务何时结束。 – Seb

+0

是的,这就是我写的。在我的示例中,使用sidekiq队列作为'唤醒事件',每10秒钟一次,并将真实队列存储在数据库中 - 模型“Job”中。 –