2017-03-13 10 views
1

私はRuby on Railsルートを持っています。 config/routes.rbは言う:POST扱うRuby on Railsルートの処理を延期するにはどうすればよいですか?

def testruns 

方法:私が持っている

post 'upload/testruns' => 'upload#testruns' 

app/controllers/api/upload_controller.rbで。問題は、アップロードデータが蓄積するにつれて、それが必要とする関連する計算(例えば、統計を保持し、アップロードごとにそれらを再計算するなど)のために、プロセスの処理時間が増加することである。

これは反対側(すなわち、POSTからhttps://app.com/upload/testrunsを開始する側)をブロックし、最終的にはハードコードされたタイムアウトになります。私は完全にタイムアウトを増やすことができますが、それは猫とマウスのゲームです。すぐに何度も何度も増やす必要があります。

POST(ほんの数秒であるはずです)を受け取った直後にテストランズの処理方法から戻って、どうすればいいですか?統計処理は後で?

POSTされているデータは大きくありません。それはますます長くなるプロセスのためにそれを作る蓄積された歴史です。あなたが実行することにより、ジョブusignのActiveJobsを作成することができます

+3

使用のバックグラウンドジョブ 'activejob'または個別に' 'sidekiq' resque'は、すべての処理inbackgroundを作成し、応答時間が少なくなりますので、ジョブIDと素早いレスポンスを送信します –

答えて

0

rails generate job test_runs 

編集仕事

class TestRunJob < ApplicationJob 
    queue_as :default 

    def perform(params) 
    # Do you the stuff you need to do with your params 
    end 
end 

そして、あなたのコントローラでは、ジョブを開始します。これはActiveJobは(あなたのパラメータに&引数を渡す)あなたのクライアントに応答を返信する方法で取得せずに実行することができます:

class Upload < ActionController 
    def testruns 
    # Initiate Job 
    TestRunJob.perform_later(params) 

    # Respond to client immediately 
    render plain: "Doing the stuff, continue on now" 
    end 
end 

あなたはまた、宝石をインストールして構成することによって、あなたがしたい方、バックグラウンド・ジョブ・サービスを使用することができますあなたのapplication.rb内のアダプタ:

# config/application.rb 
module YourApp 
    class Application < Rails::Application 
    config.active_job.queue_adapter = :sidekiq 
    end 
end 
関連する問題