从内部优雅地终止Rails应用程序

时间:2017-09-14 11:08:34

标签: ruby-on-rails docker

我有一个Rails 5应用程序(API)和一个postgres DB,它们运行在不同的docker容器上,所有这些都在同一个AWS EC2实例上,并由外部管理器(manage)控制。 manage 需要能够向 API 发出请求并告诉它退出。我不想只是从外部杀死API或停靠器容器,因为我希望所有 API 请求完成。我希望 API 优雅地退出,只有它知道如何做到这一点 Ruby有退出,退出!并且中止。所有这些似乎都由Rails处理,因为例外和Rails只是继续开车。

如何从内部终止我的rails应用程序?我可以提出某种不可处理的例外吗?

1 个答案:

答案 0 :(得分: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