我正在编写一个应用程序,有时需要非常长时间运行的数据库请求。如果客户端重新加载或关闭页面以执行数据库请求,我想执行一些代码。
我希望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调用的断开连接。
有更好的方法吗?
答案 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