Domanda

Scenario:Applicazione Web basata su Apache Wicket in esecuzione sul server Tomcat.

L'utente apre l'URL nel browser, viene creata la sessione e nel browser viene visualizzata la semplice pagina principale, l'utente fa clic sul pulsante e Viene invocata la chiamata AJAX.L'applicazione riceve la richiesta e fa alcune cose preparando la risposta.Nello stesso tempo vengono richiamati l'utente o JavaScript nel browser un'altra chiamata AJAX -- questa seconda richiesta viene elaborata in un altro thread nell'applicazione e poiché la maggior parte delle parti dell'applicazione sono specifiche della sessione e non sono thread-safe (perché un utente = una sessione), lancia un'eccezione.

Possibili soluzioni:

  1. rendere tutte le classi applicative thread-safe (molto costose)

  2. adattare la GUI in modo che non vengano eseguite contemporaneamente due chiamate AJAX in una sessione (impossibile a causa della natura della GUI del browser)

  3. sincronizzare tutte le richieste in un'unica sessione a livello Wicket o Tomcat (ma come?)

  4. un'altra pratica o tecnica ???

Grazie

È stato utile?

Soluzione

Le richieste a pagine o componenti all'interno della stessa pagina in una singola sessione sono già sincroni, solo un thread alla volta.Richieste di risorse come immagini, javascript, file CSS ecc.vengono gestiti in modo asincrono.(Diversi client non si bloccano mai a vicenda poiché ogni cliente ha una propria sessione e PageMap).

Tuttavia, credo che l'accesso agli elementi nella Sessione stessa non sia esplicitamente sincronizzato.

Per inciso, accedere alla sessione/pagine da un thread che non è un thread di richiesta non è una buona idea, poiché il contenitore è libero di fare qualsiasi cosa con la sessione/pagina tra le richieste, ad es.scriverlo su disco, ecc.

Altri suggerimenti

Qual è l'eccezione che viene lanciata?Se viene lanciata un'eccezione, suppongo che esista una sezione critica dell'oggetto Session che deve essere sincronizzata o gestita con maggiore attenzione e forse non l'intera sessione.

Non ho avuto motivo di utilizzarli molto, ma so che ci sono canali come parte di wicket-ajax.js (che si trova nel pacchetto org.apache.wicket.ajax).Questi controllano il modo in cui vengono gestite più chiamate AJAX.Potrebbe valere la pena dare un'occhiata.In questo file c'è il seguente commento:

/**
 * Channel management
 *
 * Wicket Ajax requests are organized in channels. A channel maintain the order of 
 * requests and determines, what should happen when a request is fired while another 
 * one is being processed. The default behavior (stack) puts the all subsequent requests 
 * in a queue, while the drop behavior limits queue size to one, so only the most
 * recent of subsequent requests is executed.
 * The name of channel determines the policy. E.g. channel with name foochannel|s is 
 * a stack channel, while barchannel|d is a drop channel.
 *
 * The Channel class is supposed to be used through the ChannelManager.
 */
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top