用户中止连接时执行某些操作(Sinatra + Thin)

时间:2011-12-08 06:26:29

标签: ruby sinatra eventmachine thin

我正在编写一个应用程序,有时需要非常长时间运行的数据库请求。如果客户端重新加载或关闭页面以执行数据库请求,我想执行一些代码。

我希望Rack可以挂钩这个东西,但显然从我看到的这个比Rack更深的层次。

到目前为止,我能找到的唯一一个钩子就是瘦本身,通过在瘦连接类中修补unbind函数:

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

这会覆盖Thin的unbind函数,让我挂钩EventMachine调用的断开连接。

有更好的方法吗?

1 个答案:

答案 0 :(得分:1)

经过一番挖掘,我发现Thin提供了一种替换'后端'的机制,或者服务器连接到客户端的方式。我正在使用它,结合机架环境中的值来处理特定的请求实例,并知道我是否需要终止查询:

class Backend < Thin::Backends::TcpServer

  def initialize(host, port, options={})
    super(host, port)
  end

  def connection_finished(connection)
    super(connection)

    if connection.request.env["query_killer"]
      connection.request.env["query_killer"].kill
    end

  end

end

这可以通过命令行参数包含在thin中:

thin start  -r 'my_module/backend' --backend MyModule::Backend