Timeout richiesta Tomcat

Nella mia applicazione web ci sono alcune richieste che durano più di 20 secondi. Ma in alcune situazioni il codice può portare a loop infiniti o qualcosa di simile che rallenta il server.

Voglio mettere un timeout della richiesta per 60 secondi sul lato server. È implementato in Tomcat?

Grazie, Horatiu

Con Tomcat 7, puoi aggiungere StuckThreadDetectionValve che ti consentirà di identificare i thread “bloccati”. È ansible impostare la valvola nell’elemento Context delle applicazioni in cui si desidera rilevare:

  ...  ...  

Ciò dovrebbe scrivere una voce WARN nel log di tomcat per qualsiasi thread che richiede più di 60 secondi, il che consentirebbe di identificare le applicazioni e vietarle perché sono difettose.

In base al codice sorgente potresti essere in grado di scrivere la tua valvola che tenta di arrestare il thread, tuttavia ciò avrebbe effetti di trascinamento sul pool di thread e non c’è un modo affidabile per arrestare un thread in Java senza la cooperazione di quel thread …

Se stai tentando di impedire che una richiesta venga eseguita troppo a lungo, impostare un timeout in Tomcat non ti aiuterà. Come dice Chris, puoi impostare il valore di timeout globale per Tomcat. Ma, da The Apache Tomcat Connector – Timeout generici di HowTo , vedere la sezione Timeout risposta:

JK può anche usare un timeout su risposte di richiesta. Questo timeout non misura il tempo di elaborazione completo della risposta. Invece controlla, quanto tempo è consentito tra pacchetti di risposta consecutivi.

Nella maggior parte dei casi, questo è ciò che in realtà vuole. Si consideri ad esempio il download a lungo termine. Non saresti in grado di impostare un timeout di risposta globale efficace, perché i download potrebbero durare per molti minuti. La maggior parte delle applicazioni tuttavia ha un tempo di elaborazione limitato prima di iniziare a restituire la risposta. Per tali applicazioni è ansible impostare un timeout di risposta esplicito. Le applicazioni che non si armonizzano con i timeout delle risposte sono applicazioni di tipo batch, data warehouse e applicazioni di reporting che prevedono lunghi tempi di elaborazione.

Se JK interrompe l’attesa di una risposta, poiché viene triggersto un timeout di risposta, non è ansible interrompere l’elaborazione nel back-end. Sebbene le risorse di elaborazione siano libere nel server Web, la richiesta continuerà a essere eseguita sul back-end, senza alcun modo per restituire un risultato dopo l’triggerszione del timeout di risposta.

Quindi Tomcat rileverà che il servlet non ha risposto entro il timeout e invierà una risposta all’utente, ma non interromperà il thread in esecuzione . Non penso che tu possa ottenere quello che vuoi fare.

È ansible impostare il timeout predefinito nel server.xml

  

Questo articolo parla dell’impostazione dei timeout a livello di server. http://www.coderanch.com/t/364207/Servlets/java/Servlet-Timeout-two-ways

Che cosa sta causando l’applicazione per andare in loop infinito? Se si aprono connessioni ad altre risorse, è ansible che si desideri impostare i timeout su tali connessioni e inviare una risposta appropriata quando si verificano tali timeout.

Per chiunque non ami nessuna delle soluzioni pubblicate sopra come me, puoi semplicemente implementare un timer tu stesso e interrompere l’esecuzione della richiesta generando un’eccezione di runtime. Qualcosa come di seguito:

  try { timer.schedule(new TimerTask() { @Override public void run() { timer.cancel(); } }, /* specify time of the requst */ 1000); } catch(Exception e) { throw new RuntimeException("the request is taking longer than usual"); } 

o preferibilmente usare il java guava timeLimiter qui

Aggiungi tomcat in Eclipse

In Eclipse, come server tomcat, fare doppio clic su “Server Tomcat v7.0 su Localhost”, modificare le proprietà come mostrato nelle impostazioni di timeout 45 in qualsiasi punto desiderato