2017-04-19 24 views
3

我正在做一個天氣API,它將從另一個API獲取,處理和保存數據。爲了獲得每日更新(請求URL信息,獲取JSON/XML數據,構建我的數據並將其保存到我的數據庫)我認爲最合適的方法是使用ActiveJob。在Rails中安排ActiveJob

我想安排作業定期運行。我想爲UNIX的cron或Spring @Scheduled註釋用於Java。

我已經看到關於調度作業堆棧溢出(this one)的另一個問題,但他們使用像任何時候外部寶石。我一直在尋找一個允許在Rails API中執行作業的後端(Backends),但似乎沒有可用的任務可以安排作業。

Rails框架(版本5)上有什麼可以讓我做我想做的事嗎?或者我必須使用外部寶石?

非常感謝。

編輯 如果是有用的人,這裏是工作模式:

class ImportDailyDataJob < ApplicationJob 
    queue_as :default 

    def perform(*args) 
    # Do something later 
    end 

    private 

    def prepare_request 
    # return the request object 
    end 

    def request_data 
    # Get the data from external API. 
    end 

    def process_data 
    # Process the data 
    end 

    def save_processed_data 
    # Saves the data to the database 
    end 
end 
+0

上投票,因爲一個唯一的方式來做到這一點會很好。我個人使用cron作業來運行rails腳本。 –

+0

只是澄清一些關於外部寶石VS ActiveJob:AJ提供了一個_common interface_到各種隊列適配器使得它使用相同的代碼,例如Resque,可以很容易地切換到說,Sidekiq。但是,您並沒有從AJ _without_在rails core之外使用某些工具獲得太多好處。 – Glyoko

回答

1

這不是真正的調度,但你可以僞造它在某些情況下,如果你不需要調度到你的情況完全準確,即運行作業每天一次:

class WeatherJob < ApplicationJob 
    def perform 
    reschedule_job 

    do_work 
    end 

    def do_work 
    # ... 
    end 

    def reschedule_job 
    self.class.set(wait: 24.hours).perform_later 
    end 
end 

入隊未來使用ActiveJob運行的作業應該與DelayedJob或Sidekiq一起使用,可能在所有活動作業後端都不支持?

+0

不錯的做法!您的方法將允許我每天執行一次這項工作,而無需使用外部寶石,但最初如何運行它? – F404

+0

第一次從軌道控制檯'bundle exec rails console'排隊 - WeatherJob.perform_later會使它立即運行,這將使記錄排隊以在24小時後再次運行 – house9

1

我想你應該使用Redis的寫一個任務來安排工作去sidekiq,做所以只需安裝這兩種寶石,可以去他們的文檔:

gem 'redis-rails' 

然後安裝sidekiq

gem 'sidekiq' 
+0

謝謝你的回答。正如兩個答案都證實的那樣,Rails上沒有內置調度器。 – F404

+0

不,並不是說ActiveJob爲你提供了redis和sidekiq的所有功能,但是它是你必須首先瀏覽文檔的rails的核心,然後你可以處理這個,但是redis和sidekiq會給你提供更好的對ui的理解也是這樣。 –

1

大多數主要的AJ適配器都具有一些用於調度作業的功能,但有些功能已將其分離爲單獨的gem。對於Resque來說,這裏有一個獨立的resque-scheduler寶石,與香草Resque寶石一起工作。

here's有關重複作業的位。經過一些基本設置之後,您可以創建一個schedule.yml文件來定義您希望如何/何時運行作業,例如

# config/initializers/resque_scheduler.rb 
Resque.schedule = YAML.load_file('../calendar.yml') 

# config/calendar.yml 
your_recurring_job: 
    cron: "0 0 * * *" # Every day at midnight 
    class: "YourJobClass" 
    queue: your_queue 
    args: 
    description: "This job does a thing, daily" 

我不知道每個適配器,但主要的通常都有類似的姊妹寶石提供此功能。

+0

要清楚,雖然這使用cron語法,但它不會經過cron。它完全在Redis/Resque內工作。 – Glyoko

+0

感謝您的解釋和鏈接。我需要調查Redis在作業調度程序中的作用,因爲這兩個答案都建議使用外部gem + Redis。但這將是另一個問題的好主題。無論如何,我可能使用Resque。 – F404

相關問題