3

各コントローラーが @PostConstruct で ZooKeeper に登録し、@PreDestroy で登録解除する Spring MVC レスト コントローラーで Curator サービス ディスカバリーを使用しています。

私が抱えている問題は、 @PreDestroy メソッドが呼び出されるまでに、コントローラーが既にリクエストを処理していないことです。コントローラーの停止と登録解除の間に発生する少数の要求に対して例外がスローされないように、コントローラーが要求の処理を停止する前に、コントローラーの登録を解除する必要があります。

春の ApplicationListener インターフェイス、SmartLifecycle、および ServletContextListener を試しましたが、すべてのシャットダウン/クローズ関連のフックで、コントローラーは要求の処理を既に停止しています。

コントローラーがリクエストの処理を停止する前に登録を解除できるシャットダウン フックが必要ですが、利用できるかどうかはわかりません。

4

1 に答える 1

1

そのようなフックがSpringに存在するとは思わない。

ただし、特定の予約済み URL にマップされた特別なコントローラを持つことができます/activity/suspend-traffic。そのために、ある種の基本的なセキュリティ、おそらくアプリケーション固有のトークン、つまり/activity/suspend-traffic/{token}.

この特別なコントローラーが正しいトークンを受け取ると、ZK からすべてのアプリケーション コントローラーを登録解除します。

これにより、リクエストが失われることはありません。その後、アプリケーションがトラフィックを受信しなくなったら、サーバーを安全にシャットダウンできます。を送信/activity/suspend-traffic/{token}した後、サーバーが中断コマンドの後に受信した要求の処理を終了するように、シャットダウンする前に一定時間待つことができます。

または、アプリケーションの「内部」にあるリクエストの数をカウントするフィルターまたは mvc インターセプターなど、より洗練されたメカニズムを実装することもできます。その特別なコントローラーに別のマッピングを含めることができます。つまり/activity/request-count、処理中の実際のリクエスト数を返します。このリクエストが を返したら0、サーバーを安全にシャットダウンできます。

于 2015-03-18T01:06:24.067 に答える