時々非常に長時間実行されるDBリクエストが必要なアプリケーションを作成しています。私はいくつかのコードを実行したいのですが、クライアントがDBリクエストを処理するためにページをリロードしたりクローズしたりする場合です。ユーザーが接続を中断したときに何かする(Sinatra + Thin)
私はRackがこのようなものにフックを持つことを望んでいましたが、明らかにこれがRackよりも深いレベルであることがわかりました。
これまでのところ、私は見つけることができる唯一のフックが猿パッチング薄いConnectionクラスでアンバインド機能をすることにより、薄い自体にある:
module Thin
class Connection < EventMachine::Connection
def unbind
# DO something here
@request.async_close.succeed if @request.async_close
@response.body.fail if @response.body.respond_to?(:fail)
@backend.connection_finished(self)
end
end
end
これはシンのアンバインド機能を無効にして、私は切断にフックすることができますEventMachineによって呼び出されます。
良い方法がありますか?
長い実行要求を非同期にすることを検討する必要があります。よりクリーンなデザインとなり、現在の問題も解決します。 – randomuser
私は実際に、EventMachine、em-syncrhony、およびsinatra-synchronyを使用して、要求を非同期的に実行しています。これでも問題は解決しません。要求が同期しているかどうかにかかわらず、ユーザーがDBからの結果を気にかけなくなったときを知りたいです。 – Ben
私が理解するところでは、sinatra-synchronyは同時に要求を実行するだけです。したがって、私はまだ@ガンジャンアドバイスが適用されると思います。 –