2015-12-01 18 views
6

Sto usando una maglia StreamingOutput che funzionava bene fino a quando non abbiamo aggiornato a Jersey 2.16. Ecco la cosa. Il mio StreamingOuput produce l'output molto lentamente in alcune circostanze. Scrivo regolarmente i dati, ma lo scrivo piuttosto lentamente e solo un po 'alla volta. Io chiamo flush() su OutputStream passato a StreamingOutput.write() ogni volta che scrivo qualsiasi byte, ma il flush() sembra non avere alcun effetto. Nulla viene inviato sul filo fino a quando 8K non è stato scritto su OutputStream. Sfortunatamente, in alcune circostanze, quando è stato scritto 8K, il client è scaduto.chiamata flush() su Jersey StreamingOutput non ha effetto

Ho scaricato alcuni della sorgente maglia e attraverso alcuni debug, vedo che il OutputStream passato a write() è un UnCloseableOutputStream che avvolge un CommittingOutputStream.

Il CommittingOutputStream ha il buffering abilitato, e quindi flush() è essenzialmente un no-op fino a quando la risposta non viene confermata (completa).

Quindi, sono in un sottaceto. Come posso utilizzare un StreamingOutput (o scrivere in altro modo direttamente su un flusso di output) e forzarlo a inviare byte sul filo prima che l'intera risposta sia completa? C'è un altro modo per farlo con Jersey? Non riesco a trovare alcun metodo su ResponseBuilder per farlo. Non riesco a trovare alcun modo per disattivare il buffering.

risposta

3

Esiste la proprietà Jersey ServerProperties.OUTBOUND_CONTENT_LENGTH_BUFFER per impostare la dimensione del buffer, ma la modifica ha implicazioni sull'intestazione Content-Length (se ciò è importante per voi). Dovresti leggere i documenti sulla proprietà.

Un valore intero che definisce la dimensione del buffer utilizzata per bufferizzare l'entità di risposta lato server per determinarne la dimensione e impostare il valore dell'intestazione HTTP "Content-Length".

Se la dimensione dell'entità supera la dimensione del buffer configurata, il buffer verrà annullato e la dimensione dell'entità non verrà determinata. Valore inferiore o uguale a zero disabilita il buffering dell'entità.

Questa proprietà può essere utilizzata sul lato server per sovrascrivere il valore della dimensione del buffer dei messaggi in uscita - predefinito o il valore personalizzato globale impostato utilizzando la proprietà globale "jersey.config.contentLength.buffer".

Il valore predefinito è 8192.