2013-08-28 60 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] 
相關問題