2010-01-29 23 views

risposta

40

La cosa grande che si ottiene con servlet asincroni è HTTP push, in cui il server può richiamare le informazioni sul client quando lo desidera, piuttosto che quando il client lo richiede. Pre-asynch servlet, ciò richiederebbe connessioni HTTP a esecuzione prolungata, ciascuna delle quali vincolava un thread del server, che è molto inefficiente. Questo nuovo modello disaccoppia l'elaborazione lato server dalla gestione della connessione.

+2

+1 per un riassunto chiaro. – BalusC

+2

Cosa succede se si stanno verificando i dati Ajax sul lato server e l'utente va a una pagina Web diversa? Quindi ora non hanno più bisogno di questi dati? O cosa succede se l'utente aggiorna la pagina? Ci sarebbero ora due istanze sul lato server che controllano i dati dell'utente? – gmustudent

4

L'elaborazione asincrona è stata introdotta per i casi in cui non è necessario tenere un filo durante l'intero ciclo di elaborazione delle richieste. L'esempio tipico di un caso del genere è una funzionalità simile a comet.

L'utilizzo dell'elaborazione asincrona in tutti i casi non varrebbe nulla, perché in genere l'elaborazione back-end consuma comunque un thread.

20

Leggere l'articolo, il supporto di elaborazione asincrono nelle specifiche Servlet 3.0 ha un caso d'uso molto specifico: è progettato per gestire il caso in cui si dispone di un'applicazione AJAX che effettua richieste che attivano processi potenzialmente di lunga durata in background.

Il motivo per cui avevamo bisogno di qualcosa del genere era rispondere a un problema nel modello thread-per-request, che alloca un thread ogni volta che il client richiede una pagina dal server, piuttosto che allocare un singolo thread per il client intera sessione. Questo ha funzionato bene prima di AJAX quando i client eseguivano le richieste sporadicamente, ma i benefici si sono persi quando le applicazioni AJAX aumentavano significativamente il numero di richieste che un client avrebbe fatto.

In particolare, se una richiesta AJAX attiva qualcosa di potenzialmente lento o bloccante, come un'operazione di database, siamo tornati dove abbiamo iniziato - i thread dal threadpool del server sono potenzialmente inattivi.

Il supporto di elaborazione asincrona tenta di mitigare ciò inserendo le richieste in una coda centralizzata, in modo tale che i thread non siano sempre bloccati in attesa di risultati di richieste che potrebbero non essere state ancora elaborate. In breve, stiamo cercando di ottenere il massimo dai nostri thread in ogni momento - cioè, diminuendo la quantità di tempo in cui sono inattivi (ma potrebbe servire un'altra connessione).

Come ogni nuovo sviluppo, questo non è qualcosa da utilizzare come strumento adatto a tutti. Cerca il caso specifico nella tua applicazione dove è appropriato.

+4

+1 "Leggere l'articolo ..." – user359996

2

Ho appena sfogliato l'articolo collegato, questo è un miglioramento sul lato server, non sul lato client asincrono.

Riassumendo l'articolo:

Si consiglia di utilizzare servlet asincroni in una situazione in cui si ha un carico di richieste che arrivano (simile a colpire il server con richieste AJAX), e non si vuole servire su un thread per richiesta. Il TPR può essere pericoloso in questo scenario quando il tempo di elaborazione richiede un po 'di tempo, causando l'esaurimento del pool di thread.

Il lavoro verrà bloccato in una coda di lavoro e il thread può essere ritirato fino al completamento del lavoro e la risposta viene infine confermata quando le risorse si liberano per consentirne il completamento.

Cose davvero interessanti.

1

La sua base requrirement in cui ogni possibilità di un filo ottengono in condizione di riposo in quella situazione u dovrebbe utilizzare asincrona Servlet altrimenti non beacause di noi non può fare così tanti filo

Se un servlet o un filtro raggiunge un potenziale operazione di blocco durante l'elaborazione di una richiesta, può assegnare l'operazione a un contesto di esecuzione asincrona e restituire immediatamente il thread associato alla richiesta senza generare una risposta. L'operazione di blocco viene completata nel contesto di esecuzione asincrona in un thread diverso, che può generare una risposta o inviare la richiesta a un altro servlet.

Per attivare l'elaborazione asincrona su un servlet, impostare il parametro asyncSupported su true l'annotazione @WebServlet come segue:

@WebServlet (urlPatterns = { "/ asyncservlet"}, asyncSupported = true) public class AsyncServlet extends HttpServlet {...}

Synchronous (Classic Web-Application Model) Una richiesta sincrona blocca il client fino al completamento dell'operazione, ad es. il browser non risponde. In tal caso, il motore di script java del browser è bloccato.

Asincrono (modello di applicazione Web AJAX) Una richiesta asincrona non blocca il client in quanto il browser è reattivo. A quel tempo, l'utente può eseguire anche altre operazioni. In tal caso, il motore di script java del browser non è bloccato.

Nella comunicazione sincrona entrambi sono attivi contemporaneamente dove come in Asynchronous alcuna necessità di attivi contemporaneamente per esempio asincrono riferisce alla messaggistica lì bloccando il funzionamento in un filo e l'esecuzione del thread associato al contenitore

I contenitori Web nei server delle applicazioni utilizzano normalmente un thread del server per richiesta del client. In condizioni di carico pesante, i contenitori richiedono una grande quantità di thread per soddisfare tutte le richieste dei client. Le limitazioni di scalabilità includono l'esaurimento della memoria o l'esaurimento del pool di thread del contenitore. Per creare applicazioni Web scalabili, è necessario assicurarsi che nessun thread associato a una richiesta sia inattivo, in modo che il contenitore possa utilizzarli per elaborare nuove richieste.

Esistono due scenari comuni in cui un thread associato a una richiesta può essere inattivo.

The thread needs to wait for a resource to become available or process data before building the response. For example, an application may need to query a database or access data from a remote web service before generating the response. 

The thread needs to wait for an event before generating the response. For example, an application may have to wait for a JMS message, new information from another client, or new data available in a queue before generating the response.