2011-06-28 3 views
3

私のアプリケーションコントローラには、タイムアウトブロック内のすべてのアクションを囲むためにaround_filterがありますので、30秒間のHeroku制限に達する前にアクションが失敗します。私もrescue_from Timeout :: Errorを持っているので、これらのタイムアウトをきれいに救済することができます。残念ながら、rescue_fromは時間の一部しか動作しません。Rescue_fromはレスキューしません。

コントローラ内で実行中にタイムアウトが発生しても、正常に動作しますが、タイムアウトがビューまたはヘルパー内で発生した場合はレスキューできません。

どちらもInterruptもSignalExceptionもありません。両方ともTimeout :: Errorが継承し、どちらも正しくレスキューします。ただし、例外自体を救済する場合は、ビューとヘルパー内で正しくレスキューします。

around_filter :timeout 
rescue_from Timeout::Error, :with => :timeout_rescue 

def timeout 
    Timeout::timeout(10){ 
    yield 
    } 
end 

def timeout_rescue 
    # Rescued 
end 

タイムアウト::エラーを救済する他の方法はありますか?

答えて

4

同じ問題が発生しました。私はRails 3 + Rack :: Timeoutを使い、ApplicationControllerでrescue_fromしようとしています。

私はこれを使用して終了

...

rescue_from Exception do |exception| 
    if exception.is_a?(Timeout::Error) || /execution expired/ =~ exception.message 
    # rescued from timeout error 
    end 
    raise 
end 

UPDATE私は正常にタイムアウト::エラーを返すようにラックタイムアウト宝石をパッチを適用しました。それはスレッドの問題でした。オフィシャルギフトが更新されました:https://github.com/kch/rack-timeout

新しい優先メソッドが以下にあります。一般に例外から救うのは良い考えではないので、可能ならば避けるべきです。

class ApplicationController < ActionController::Base 
    rescue_from Timeout::Error, with: :handle_timeout 

    def handle_timeout(exception) 
    # handle timeout error 
    end 
end 
+1

ありがとう、ありがとう。それは私の問題を解決する! – Huston

+0

ヒューストン、私は問題を解決するためにラックタイムアウトの宝石をパッチしてしまいました。 Caio(kch)は公式のラックタイムアウトを更新しました。 https://github.com/kch/rack-timeout – simple10

+1

古いスレッドにつけて申し訳ありません。 。 。 。しかし、タイムアウトが発生したときにPostgresデータベース接続を正常に閉じるために、上記のコードをどのように使用するのかと思います。ラックのタイムアウトが発生し、データベース接続がリムボーで止まってしまったため、私のアプリは「クラッシュ」しています。 。 。私のユニコーンプロセスは16個すべてデータベースに接続できなくなります。私はこのことがまったく新しい問題を正当化するかどうかはわかりませんでした。 – bcb

1

Timeoutが実行を終了するために例外を発生させる必要がある場合、Timeout :: Errorは発生しません。そうであれば、園芸品種の救助はそれを罠に掛け、それはあなたが望むものではありません。代わりに、:: Exceptionから派生した独自のExceptionを生成します。したがって、レスキュー例外を除くすべてのレスキューで吹き飛ばされます。または、自分のExceptionを2番目のパラメータとしてTimeout :: timeoutに渡すことができます。これにより、レスキューできるようになります。タイムアウトはそれを再発生させることに注意してください。

timeout.rbコード(ruby200/lib/ruby​​/2.0.0)を読みます。それはかなり短く、かなり興味深いもので、実際にどのように機能するか教えてくれます。

関連する問題