1

メッセージを受け取り、データをサードパーティの URL に投稿するコントローラーがあります。

def create
    @message = Message.new(params[:message])

    if @message.valid?
      post_to_server(@message)
    end
end


private 

def post_to_server
 # Http Post to 3rd Party Url
end

メッセージは ActiveRecord オブジェクトではありません。これは、いくつかの ActiveModel 検証を備えたプレーンな Ruby オブジェクトです。

ここでの私の懸念は、サードパーティのサーバーからの応答を待っている場合、アプリケーションが遅く見える可能性があることです。ユーザーがすぐに応答を取得でき、post_to_server 部分がバックグラウンドで実行されるように、このメソッドの実行を延期する最良の方法は何でしょうか?

私は少しグーグルでこれを見つけました: https://github.com/collectiveidea/delayed_job

ただし、それには、オブジェクトがアクティブなレコード オブジェクトであり、永続化されている必要があります。これは私が必要とするものには少しやり過ぎのようです。

応答が返されるまでメソッドの実行を延期する他の方法はありますか?

ありがとう

4

2 に答える 2

3

これを行う簡単な方法は 1 つだけであり、delayedjob や resque、または遅延バックグラウンド処理を提供するその他の gem を使用することです。リクエストの送信は IO ブロッキングであるため、このリクエストを defered スレッドで送信すると、現在のプロセスが ruby​​ mri でブロックされます。

DelayedJob は、YAML を使用してオブジェクトをマーシャリングし、実行のために変換するため、任意のオブジェクトを渡すことができます。

class Message
  def post_to_server
    # long running method
  end
  handle_asynchronously :post_to_server
end

@message.post_to_server また

class Jobs
  def self.post_to_server(message)
    # long running method
  end
  handle_asynchronously :post_to_server
end

Jobs.post_to_server(@message)

https://github.com/collectiveidea/delayed_job

于 2012-05-24T11:09:38.803 に答える
2

私は、delayed_job が ActiveRecord オブジェクトや持続性についてそれほど気にしているとは思いません。ドキュメントに記載されているように:

任意のオブジェクトで .delay.method(params) を呼び出すと、バックグラウンドで処理されます。

https://github.com/collectiveidea/delayed_job#queuing-jobs

私たちはプロジェクトでそれをそのまま使用して、良い結果を出しています。私の調査によると、delayed_job は目的を達成するための最も簡単な方法です。他にも役立つキューイングメカニズム (RabbitMQ、ZeroMQ) がありますが、私の意見では、これらはやり過ぎになるでしょう。

あなたの場合、次のようなものを試してください:

@message.delay.post_to_server
于 2012-05-24T11:09:30.160 に答える