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

非常に「ハック」に思えますが、とにかく URI への呼び出しを介して Web サーバーをリモートでシャットダウンできる点に疑問があります。;-)

于 2013-10-22T20:25:15.100 に答える