Estou tentando encontrar uma propriedade tomcat para definir um tempo limite de solicitação. Especificamente, eu estava procurando uma maneira de limitar a quantidade de tempo que a solicitação leva do lado do servidor.
Depois de fazer algumas pesquisas, parece que não é possível e
não há como garantir isso [um tempo limite], pois você não pode forçar o encadeamento que está manipulando a solicitação a parar .
Isso parece intencional, o que me faz pensar por quê.
Quais são as razões contra ter tal propriedade? Ou é uma limitação técnica da arquitetura?
PS: Descobri que a mesma coisa vale para Tomcat, Httpd e, aparentemente, wakanda? é por isso que minha pergunta é sobre servidores em geral. Por favor, corrija-me se eu estiver errado nessa suposição.
Não há mecanismo para parar um thread em Java
Costumava haver tal mecanismo (
Thread.stop()
), mas não era seguro, pois poderia deixar os objetos em estado inconsistente. Isso ocorre porque, se os encadeamentos podem ser interrompidos abruptamente, você não pode garantir que o comportamento ocorra antes. Como o encadeamento pode ter parado bem no meio de uma seção crítica, consulte Por que Thread.stop foi preterido? .Em vez disso, peça educadamente para parar
Você pode tentar
Thread.interrupt()
, mas cabe à sua lógica de negócios verificar se issoThread.isInterrupted()
. Você? Provavelmente não. Portanto, mesmo que você pudesse definir um tempo limite, em muitos casos não funcionaria.A maioria dos aplicativos da web são, na verdade, vinculados ao banco de dados. Ou seja, eles passam a maior parte do tempo fazendo alguns pedidos. Se você realmente deseja limitar o tempo de solicitação e seu aplicativo também está vinculado ao banco de dados, pode definir alguns tempos limite nesse nível. Por exemplo , C3P0 fornece alguns tempos limites como unreturnedConnectionTimeout , checkoutTimeout e bancos de dados como PostgeSQL fornecem todos os tipos de opções como statement_timeout .
O mesmo com qualquer outra comunicação pela rede - se você não quiser correr o risco de travar devido a firewalls ou outros motivos, precisará configurar connectionTimeout e socketTimeout. Ferramentas como o RestTemplate do Spring têm essas opções. Isso ajudará nos casos em que o outro lado não responder. Mas de nada adiantará se o outro lado responder muito devagar, gradualmente.