2017-02-13 7 views
0

特定のrequestがまだ有効かどうかをどうやって検出できますか? UUID ABC1233との要求がまだ動作しているか、どのように私は知ることができ、別の要求からRails、特定のリクエストがまだ実行中かどうかを知る方法

# my_controller.rb 
def my_action 
    request.uuid # -> ABC1233 
end 

:たとえば

私は、この要求のUUIDがありますか?好奇心のために


私はURLリクエストを使用してcronジョブを実行していbeanstalk directives後。

前回の実行中に次の繰り返しを開始したくない場合。私はちょうどそれが完了する前にいくつかの時間が死ぬので、要求によって更新されたini/endフラグで中継することはできません。

通常のcronタスクを使用して、プロセスのPIDを使用して正しく管理していました。 しかし、Webサーバーのプロセスをさまざまな要求の間で再利用できるため、PIDを使用することはできません。

答えて

0

最後に私は以前のアプローチをPIDに基づいて回復しました。私はRailsの要求から、このコードを呼び出すことができますし、要求プロセスが再利用されている場合でも、子1ではないと私は子プロセスのPIDを監視することができ

# The Main Process 
module MyProcess 
    def self.run_forked 
    Process.fork do 
     SynchProcess.run 
    end 

    Process.wait 
    end 

    def self.run 
    RedisClient.set Process.pid # store the PID 

    ... my long process code is here 
    end 

    def self.still_alive?(pid) 
    !!Process.kill(0, pid) rescue false 
    end 
end 

# In one thread I can do 
MyProcess.run_forked 

# In another thread I can do 
pid = RedisClient.get 
MyProcess.still_alive?(pid) # -> true if the process still running 

私はこのような何かを実装しましたRubyプロセスがまだ実行中かどうかを確認してください。

0

Rails(またはもっと正確には、Rack)がこれをサポートしているとは思っていません。私の知る限りでは、各Railsの要求は他の要求について知りません。実行中のすべてのスレッド(さらにはプロセス)へのアクセスを試みるかもしれませんが、そのような実装(可能であれば)は私にとっては醜いようです。

自分で実装するのはどうですか?

class ApplicationController < ActionController::Base 
    before_filter :register_request 
    after_filter :unregister_request 

    def register_request 
     $redis.set request.uuid 
    end 

    def unregister_request 
     $redis.unset request.uuid 
    end 
end 

after_filtersはスキップされて以来、あなたはまだ(おそらくミドルウェアには、このコード全体を動かすの例外を除いて何をすべきかを把握する必要があります:ミドルウェアの前段階で、それはRedisのためにUUIDを書き込み、上フェーズ後にキーを削除します)。これを達成するための他の方法がたくさんあります。私は確信していますし、あなたの好きな永続性を赤字に置き換えることは明らかです。

+0

私はこのようなものを実装していますが、要求が消滅したり(システムレベルで)殺される可能性があり、 'unset'シグナルが送信されないため信頼できません。これは、リクエストがまだ生きているかどうかを知るための外部メソッドが必要なためです。 – fguillen

+0

私はあなたと同じくらい迷っています。明らかにタイムスタンプをredisに保存することもできますし、定期的に古いものを削除することもできますが、おそらくすでにそれを知っていることでしょう。もっと何かを見つけたら教えてください、それは面白い問題です! –

+0

私の答えをチェックしてください:http://stackoverflow.com/a/42227927/316700 – fguillen

関連する問題