REST実行に時間がかかる可能性のあるAPIがあり、実行時間を制限したい。30秒が経過してもリクエストが返されない場合は、返却したい特定のHTTPコード/データとその要求を完全に終了します。
現在のコード:
@RestController
@CrossOrigin(origins = {"*"}, maxAge = 4800, allowCredentials = "false")
public class APIController {
@RequestMapping(value = "/api/myapifunc", method = RequestMethod.POST, produces = "application/json")
public ResponseEntity<?> optimize(@RequestParam(value="param1", defaultValue="")) {
// Code here
}
サーキットブレーカーパターン を記述しているようです。クライアントとサーバーの両方のコードを制御していて、Spring CloudとNetflix Hysterixライブラリを調べたい場合は、 Getting Started:Circuit Breaker ガイドをご覧ください。
Apache Tomcatをサーブレットコンテナーとして使用している場合は、 スタックスレッド検出バルブ を構成できます。
このバルブを使用すると、処理に長い時間がかかる要求を検出できます。これは、それを処理しているスレッドがスタックしていることを示している可能性があります。さらに、必要に応じて、そのようなスレッドに割り込んで、それらをブロック解除することもできます。
そのような要求が検出されると、そのスレッドの現在のスタックトレースがWARNレベルでTomcatログに書き込まれます。
スタックスレッドのIDと名前は、JMXを通じてstuckThreadIdsおよびstuckThreadNames属性で取得できます。このIDを標準のスレッドJVM MBean(Java.lang:type = Threading)で使用して、スタックしている各スレッドに関する他の情報を取得できます。
このプロパティ構成を設定できます
server.connection-timeout=30000
あなたのapplication.propertiesで。 公式ドキュメント に基づいています:
server.connection-timeout =#コネクタが接続を閉じる前に別のHTTPリクエストを待機する時間。設定されていない場合、コネクターのコンテナー固有のデフォルトが使用されます。 -1の値を使用して、タイムアウトがない(つまり、無限)ことを示します。
_@RequestMapping(value = "/api/myapifunc", method = RequestMethod.POST, produces =
"application/json")
public ResponseEntity<?> optimize(@RequestParam(value="param1", defaultValue="")) {
return new Callable<String>() {
@Override
public String call() throws Exception {
Thread.sleep(3000); //this will cause a timeout
return "foobar";
}
};
}
_
今後使用できる、またはアノテーション@Timed @Transactional(timeout = 3000)