Ho un'applicazione web e un client, entrambi scritti in Java. Per quello che vale, il client e il server sono entrambi su Windows. Il client rilascia HTTP GET tramite Apache HttpClient. Il server blocca fino a un minuto e se non sono arrivati messaggi per il client entro quel minuto, il server restituisce HTTP 204 Nessun contenuto. Altrimenti, non appena un messaggio è pronto per il client, viene restituito con il corpo di un HTTP 200 OK.Cosa può causare il blocco del pacchetto TCP/IP senza interrompere la connessione?
Ecco ciò che mi ha perplesso: intermittente per uno specifico sottoinsieme di clienti - sempre i clienti con connessioni di rete in modo dimostrabile a fiocchi - il client invia un GET, il server riceve ed elabora il GET, ma il cliente si siede per sempre . Abilitando i log di debug per il client, vedo che HttpClient è ancora in attesa della prima riga della risposta.
Non c'è nessuna eccezione lanciata sul server, almeno nulla è stato registrato da nessuna parte, non da Tomcat, non dalla mia webapp. In base ai registri di debug, è presente ogni segno che il server ha risposto correttamente al client. Tuttavia, il cliente non mostra alcun segno di aver ricevuto nulla. Il client si blocca indefinitamente in HttpClient.executeMethod. Ciò diventa ovvio dopo il timeout della sessione e il client esegue un'azione che fa in modo che un altro thread emetta un POST HTTP. Ovviamente, il POST fallisce perché la sessione è scaduta. In alcuni casi, sono trascorse le ore ore tra la sessione in scadenza e il client che ha emesso un POST e scoperto questo fatto. Per tutto questo tempo, executeMethod
è ancora in attesa della linea di risposta HTTP.
Quando utilizzo WireShark per vedere cosa sta realmente accadendo a livello del filo, questo errore non si verifica. Cioè, questo errore si verificherà entro poche ore per client specifici, ma quando WireShark è in esecuzione su entrambe le estremità, questi stessi client verranno eseguiti durante la notte, 14 ore, senza errori.
Qualcun altro ha riscontrato qualcosa di simile? Cosa nel mondo può causarlo? Pensavo che il TCP/IP garantisse la consegna dei pacchetti anche attraverso i problemi di rete a breve termine. Se imposto un SO_TIMEOUT e ritento immediatamente la richiesta al timeout, il tentativo ha sempre esito positivo. (Ovviamente, per prima cosa, la richiesta di timeout è abort e rilascio la connessione per garantire che venga utilizzato un nuovo socket.)
Pensieri? Idee? C'è qualche impostazione TCP/IP disponibile per Java o un'impostazione di registro in Windows che abiliterà tentativi di TCP/IP più aggressivi sui pacchetti persi?
Suoni come l'osservazione sta cambiando il risultato -> Heisenbug -> qualcosa di sbagliato con il threading. In questo caso sembra che qualcuno stia andando troppo veloce (metterei i miei soldi su HttpClient) e semplicemente deadlock per questo. È possibile che tu abbia riscontrato un bug in HttpClient, sperando che altri possano essere più utili e aiutarti a risolvere questo problema. – Esko