PDA

View Full Version : [Java] Risposta immediata Servlet


durbans
06-07-2007, 09:38
Dovrei scrivere una servlet Java che quando riceve una richiesta , risponda subito con una risposta NULL (nel senso che non mi interessa il contenuto della risposta) al client, pero' poi continui a fare altre cose (scrittura su DB).

Devo creare a mano un thread che gestisca la scrittura su DB , mentre nell'altro flusso torno null ?

k0nt3
06-07-2007, 09:46
Dovrei scrivere una servlet Java che quando riceve una richiesta , risponda subito con una risposta NULL (nel senso che non mi interessa il contenuto della risposta) al client, pero' poi continui a fare altre cose (scrittura su DB).

Devo creare a mano un thread che gestisca la scrittura su DB , mentre nell'altro flusso torno null ?
il modo più semplice è scrivere prima sul DB e poi restituire NULL, in questo modo ti assicuri di aver scritto prima di dare la risposta e nel caso fallisce la scrittura puoi anche mandare un messaggio di errore.
comunque il dialogo servlet/DB è diretto?

durbans
06-07-2007, 09:52
No , appunto, mi serve proprio ritornare subito NULL perche' non mi interessa l'esito della scrittura sul DB (sia che vada bene sia che fallisca) , l'importante e' che la risposta della servlet sia IMMEDIATA per non far attendere troppo.
Il colloquio servlet/db e' diretto.

Cmq la soluzione e' col thread ?

k0nt3
06-07-2007, 10:11
No , appunto, mi serve proprio ritornare subito NULL perche' non mi interessa l'esito della scrittura sul DB (sia che vada bene sia che fallisca) , l'importante e' che la risposta della servlet sia IMMEDIATA per non far attendere troppo.
Il colloquio servlet/db e' diretto.

Cmq la soluzione e' col thread ?
mmm ma con che istruzione mandi la risposta NULL? io ho usato le servlet solo in campo WEB.. comunque non è possibile farlo sequenzialmente, cioè prima mandare la risposta e poi scrivere sul DB?
se puoi evitare i thread evitali, altrimenti se proprio devi usali :)

PGI-Bis
06-07-2007, 13:45
Come sarebbe "se puoi evitare i Thread evitali" :D

I Thread sono nostri amici, usali.

Sì, la soluzione è un meccanismo di scrittura asincrono. Crei un oggetto Pippo che accetta una richiesta di scrittura e processa quella richiesta in un Thread diverso da quello che l'ha inviata.

La tua servlet altro non farà che dire:

ilPippo.scrivi(qualcosa);
rispondi NULL;

Essendo asincrono, scrivi restituirà immediatamente il controllo. Per la concreta esecuzione del compito affidatogli, Pippo può usare una coda di consumazione.

E' molto semplice ed efficace.

k0nt3
06-07-2007, 14:05
Come sarebbe "se puoi evitare i Thread evitali" :D

I Thread sono nostri amici, usali.

beh certo ma se è possibile fare:

rispondi(NULL);
scrivi(qualcosa);

io non complicherei ulteriormente usando i thread.. in fondo se a lui non interessa sapere se la scrittura è andata a buon fine può benissimo farla dopo la risposta. inoltre non perde nemmeno tempo perchè rispondi(NULL) credo che non si porti via molto tempo :p
cioè se è possibile fare in questo modo io non userei un thread in pratica. se invece rispondi corrisponde a una return e per cui non si può eseguire qualcosa dopo, allora il discorso è diverso ed è necessario usare un thread.

PGI-Bis
06-07-2007, 15:38
Bisognerebbe accordarsi sul termine complicazione. Un consumatore concorrente in Java è roba di venti righe. Per la servlet, scrivi(qualcosa) era e scrivi(qualcosa) rimane.

Considerando poi che la stessa istanza della Servlet gestisce le richieste di più client, scrivere prima di rispondere o rispondere prima di scrivere non cambia i termini del problema. Rispondere prima renderà immediata solo la prima richiesta.