3

我希望能够从请求中终止 Sinatra 应用程序,例如使用以下路线:

post '/terminate' do
  Thread.current.kill
end

像这样实现它有点突然。我宁愿请求完成,返回 HTTP OK 消息,然后 Sinatra 优雅地关闭。

有一个钩子可以做到这一点吗?

编辑:

我的应用程序是一个轻量级的模拟服务器,用于接收 webhook 通知。我将在同一台机器上使用多个这样的服务器(不同的端口),所以需要避免任何全局的启动/停止方法。

我的要求是因为每个服务器都必须在自己的 Ruby 实例中运行,因此我的测试和服务器之间除了通过 REST 接口之外没有通信。

我正在使用默认thin服务器来运行 Sinatra。到目前为止,我的代码只是 Sinatra::Base 的一个子类,run!从代码中开始使用。这很好也很简单,我可以制作独立的脚本来实例化每个服务器,我只需要有一种方法来停止它们。

4

1 回答 1

3

这似乎归结为发送响应后运行代码的问题。不是一件容易的事:

真正的 sinatra(ruby/rack) after_filter 的最快方法是什么?

也就是说,看起来你可以做这样的事情(虽然我没有测试过):

post '/terminate' do
  body "I'll be back..."
  # maybe clean things up here...
  logger.info "Received terminate request!"
  Thread.new { sleep 1; Process.kill 'INT', Process.pid }
  halt 200
end

看起来很“hacky”,但我质疑能够通过调用 URI 远程关闭 Web 服务器的意义。;-)

于 2013-10-22T20:25:15.100 回答