我希望能够从请求中终止Sinatra应用,例如通过以下路线:
post '/terminate' do
Thread.current.kill
end
像这样实现它有点突然。我宁愿完成请求,返回HTTP OK消息,然后Sinatra正常关闭。
是否有钩子可以做到这一点?
修改
我的应用程序是一个轻量级的模拟服务器,用于接收webhook通知。我将在同一台机器(不同的端口)上使用这样的多个服务器,因此需要避免任何全局启动/停止方法。
我的要求是由于每个服务器必须在自己的Ruby实例中运行,因此我的测试和服务器之间没有通过REST接口进行通信。
我正在使用默认的thin
服务器来运行Sinatra。到目前为止,我的代码只是Sinatra :: Base的一个子类,从代码中开始使用run!
。这很简单,我可以制作独立的脚本来实例化每个服务器,我只需要一种方法来阻止它们。
答案 0 :(得分:3)
这似乎归结为发送响应后运行代码的问题。这不是一件容易的事:
What's the fastest way for a true 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服务器的问题。 ; - )