2013-08-28 57 views
3

我在RoR应用程序中编写了一些操作,它们在流程内执行不同的操作。是否可以对Ruby操作进行字符串/队列化?

E.g. - 一项操作使用其API与第三方服务进行通信并收集数据。 - 另一个处理此数据并将其放入相关数据库中。 - 另一个将这些新数据以特定方式格式化。 等。

我想以定时的间隔启动进程,例如。每小时。但我不想每次都做这件事。

有时我可能只想做前两个动作。在其他时候,我可能想要完成流程的每个部分。

所以有一个动作运行,然后当它完成调用另一个动作。 ETC ..

这些操作可能需要一个小时才能完成,因此我需要一个不会超时的解决方案。

什么是最好的方法来实现这一目标?

+0

相关[问题](http://stackoverflow.com/questions/388016/spinning-background-tasks-in-rails#388043) – 2013-08-28 15:22:24

+0

即交是自2008年,所以胎面轻轻地 – tyler

+0

你看过使用cronjobs吗? – Davidann

回答

3

您有在后台处理作业相当多的选择:

只读通过并选择似乎以适合你的标准最好。

编辑 正如你所阐明的那样,你需要定期安排的任务。发条是一个伟大的宝石(一般比cron的一个更好的选择):

+0

谢谢,Sidekiq看起来很方便。在我的描述中,我应该明确表示这些事件将会在不断发生的情况下发生。它永远不会被用户触发。更多沿着每小时的路线,它会运行(动作1 - >动作2)。然后每12小时运行一次(操作3)。在快速搜索之后,我认为像发条这样的东西很适合这种情况,除非有另一种更适合这项任务的宝石。 (https://github.com/tomykaira/clockwork) –

+0

明白了。是发条对此很有帮助 - 它保留了后台进程,这样,每次你想要做一份工作时,都不会花费大量资源来创建一个新环境(就像cron作业一样) – tyler

+0

最后一件事。我使用rake启动方法调用,在本地工作正常。然而,在服务器上,它似乎超时。这是否会使用background_tasks发挥作用? –

1

如果你正在寻找一个很好的解决方案香草,这样的事情应该让你开始

与方法

class Api 
    def a 
    puts "a" 
    end 

    def b 
    puts "b" 
    end 

    def c *args 
    puts args.inspect 
    end 
end 

class Queue 

    def initialize delay 
    @queue = [] 
    @delay = delay 
    end 

    def add &block 
    @queue << block 
    end 

    def run 
    block = @queue.shift 
    block.call() if block 
    sleep @delay 
    run 
    end 
end 

使用范例

012泛型类
api = Api.new 
q = Queue.new 5 

q.add { api.a } 
q.add { api.b } 
q.add { api.c 1, 2, 3 } 
q.run 

输出

a 
b 
[1, 2, 3] 
相关问题