2017-04-19 6 views
3

私は気象APIを使って、別のAPIからデータを取得、処理、保存します。日々の更新(URL情報のリクエスト、JSON/XMLデータの取得、データの構築、データベースへの保存)を行うには、ActiveJobを使用するのが最も適切な方法だと思います。ActiveJob in Railsをスケジュールする

定期的にジョブを実行するようにスケジュールを設定します。私はJavaのUNIX cronやSpring @Scheduledアノテーションのようなものが好きです。

スケジューリングジョブについてもう1つの質問がスタックオーバーフロー(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

外部宝石とActiveJobの関係を明確にするために、AJはさまざまなキューアダプタに_commonインターフェイスを提供しています。つまり、Resqueなどの同じコードを簡単にSidekqに切り替えることができます。しかし、あなたはレールコアの外でいくつかのツールを使用しても、AJからの多くの利益を得ることはできません。 – 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

ニースアプローチ!あなたのアプローチは、外部の宝石を使わずに1日に1回ジョブを実行することができますが、最初にそれを実行する方法はありますか? – F404

+0

は、レールコンソール 'bundle exec rails console'から初めてenqueueするだけです。 - ' WeatherJob.perform_later'は、それを即座に実行させます。これは、レコードを再びエンキューして、24時間後に再度実行する – house9

1

私はあなたがRedisの行うには、ジョブをスケジュールするタスクを作成するを使用してsidekiqのために行くべきだと思いますので、ちょうどこの二つの宝石をインストールして、そのドキュメントのために行くことができます。

gem 'redis-rails' 

し、インストールsidekiq

gem 'sidekiq' 
+0

ありがとうございました。両方の答えが確認されているので、Railsにはスケジューラが組み込まれていません。 – F404

+0

いいえ、それはActiveJobがあなたにredisとsidekiqのすべてのビットを提供しているわけではありませんが、それは最初にドキュメントを通過しなければならないレールの中核であり、これを処理することができますが、redisとsidekiqは、これもまたUiで理解する。 –

1

大部分のAJアダプターのほとんどはジョブのスケジューリング機能を持っていますが、一部の機能は別々の宝石に分かれています。たとえばResqueの場合は、別のresque-schedulerの宝石があります。これは正確にはバニラ・レスクの宝石と一緒に働きます。

および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の使用を提案したので、ジョブスケジューラプロセスでRedisの役割を調べる必要があります。しかし、これは別の質問のための良い話題になります。とにかく、私はおそらくResqueを使用します。 – F404