2011-12-08 293 views
3

我正在編寫一個有時需要非常長時間運行的數據庫請求的應用程序。我想執行一些代碼,如果客戶端重新加載或關閉頁面來處理數據庫請求。當用戶中止連接時執行某些操作(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調用。

有沒有更好的方法?

+2

您應該考慮使長時間運行的請求異步。這將是更清潔的設計,也可以解決您目前的問題。 – randomuser

+0

我實際上是異步運行請求,使用EventMachine,em-syncrhony和sinatra-synchrony。這仍然不能解決我的問題 - 但我想知道用戶什麼時候停止關心數據庫的結果,而不管請求是否同步。 – Ben

+0

據我所知,sinatra-synchrony只能同時運行請求。所以我仍然認爲@Gunjan建議適用。 –

回答

1

經過一番挖掘,我發現Thin提供了一種替換'後端'的機制,或者服務器如何連接到客戶端。我使用的,與機架ENV值相結合來處理特定請求實例,並知道如果我需要殺一個查詢或不:

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 start -r 'my_module/backend' --backend MyModule::Backend 
相關問題