2017-09-14 68 views
3

優雅地終止Rails應用程序我有一個Rails 5應用程序(API)和一個postgres數據庫,它們運行在不同的docker容器上,全部在同一個AWS EC2實例上,並由外部管理器(manage)控制。 管理需要能夠向API發出請求並告訴它退出。我不想只是殺死外部API或Docker容器,因爲我想要完成所有API請求。我想API正常退出,只有它知道如何做到這一點。
紅寶石已退出,退出!並中止。所有這些似乎都被Rails處理爲例外,並且Rails只是繼續開着。

如何從內部終止我的rails應用程序?我能提出一些不可解決的例外情況嗎?

+0

你也可以告訴一個Rails應用程序服務器(美洲獅或什麼你?)正常關機。我確信大多數/所有的服務器都會這樣做,以響應SIGTERM。 –

+0

「通過點擊一個API端點來停止」的問題是:添加另一個API容器時會發生什麼?還是10,或500? Api請求只能擊中其中的一個,根據您的路由邏輯,它可能是隨機的。雖然理論上可以終止此服務器實例,但其他服務器將保持不變。 –

+0

@SergioTulentsev現在,應用程序不需要以這種方式進行擴展。如果事情發生變化,我們會用不同的機制來解決它。 – traday

回答

2

最有可能的是ApplicationController正在拯救SystemExit。查看Rails源代碼,ActionController中有一個rescue Exception,其中包含ActiveSupport :: Rescuable。這就是定義控制器方法rescue_from的地方。

我在Rails API的應用程序控制器測試這一點,送了它的請求,和Rails立即確實退出,以給調用者一個空的響應:

class ProcessesController < ApplicationController 
    rescue_from SystemExit, with: :my_exit 

    def destroy 
    CleanupClass.method_that_exits 
    render json: { status: :ok } 
    end 

    def my_exit 
    exit! 
    end 
end 

class CleanupClass 
    def self.method_that_exits 
    exit 
    end 
end