Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/xamarin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 有没有一种方法可以在以后的设定时间运行作业,而不使用cron,比如调度队列?_Ruby On Rails_Cron_Queue_Scheduled Tasks_Background Process - Fatal编程技术网

Ruby on rails 有没有一种方法可以在以后的设定时间运行作业,而不使用cron,比如调度队列?

Ruby on rails 有没有一种方法可以在以后的设定时间运行作业,而不使用cron,比如调度队列?,ruby-on-rails,cron,queue,scheduled-tasks,background-process,Ruby On Rails,Cron,Queue,Scheduled Tasks,Background Process,我有一个rails应用程序,我想在后台运行一个作业,但我需要从原始事件开始运行作业2小时 用例可能是这样的: 用户发布产品列表。 后台作业排队向第三方api提供辛迪加列表,但即使在原始请求之后,响应也可能需要一段时间,第三方的解决方案是每2小时轮询一次,以查看我们是否能够获得成功确认 那么,有没有一种方法可以对作业进行排队,以便工作进程守护进程知道忽略它或只在计划的时间侦听它 我不想使用cron,因为它将加载整个应用程序堆栈,并且可能在重叠的长时间运行的作业上执行两次 可以为此使用优先级队列吗?

我有一个rails应用程序,我想在后台运行一个作业,但我需要从原始事件开始运行作业2小时

用例可能是这样的:

用户发布产品列表。 后台作业排队向第三方api提供辛迪加列表,但即使在原始请求之后,响应也可能需要一段时间,第三方的解决方案是每2小时轮询一次,以查看我们是否能够获得成功确认

那么,有没有一种方法可以对作业进行排队,以便工作进程守护进程知道忽略它或只在计划的时间侦听它

我不想使用cron,因为它将加载整个应用程序堆栈,并且可能在重叠的长时间运行的作业上执行两次

可以为此使用优先级队列吗?有什么解决方案可以实现这一点?

使用gem。它作为后台线程运行,因此您不必再次加载整个应用程序堆栈。将其添加到您的GEM文件中,您的代码如下所示:

# in an initializer,
SCHEDULER = Rufus::Scheduler.start_new

# then wherever you want in your Rails app,
SCHEDULER.in('2h') do
  # whatever code you want to run in 2 hours
end
还有很多示例。

请尝试延迟作业-

类似这样的东西

class ProductCheckSyndicateResponseJob < Struct.new(:product_id)
  def perform
    product = Product.find(product_id)

    if product.still_needs_syndicate_response
      # do it ...

      # still no response, check again in two hours
      Delayed::Job.enqueue(ProductCheckSyndicateResponseJob.new(product.id), :run_at => 2.hours.from_now)
    else
      # nothing to do ...
    end
  end
end

我听说工作延期了,但我认为他们总是立即执行。我不知道:跑吧
Delayed::Job.enqueue(ProductCheckSyndicateResponseJob.new(@product.id), :run_at => 2.hours.from_now)