Abbiamo un'applicazione web con una dashboard che esegue continuamente il polling per gli aggiornamenti. Sul lato server, la richiesta di aggiornamenti viene resa asincrona in modo tale da poter rispondere quando un aggiornamento avviene tramite un sistema listener/notify.La risposta AsyncContext non corrisponde alla richiesta originale in entrata?
Il problema che stiamo vedendo è che quando una di queste richieste di polling è essere risposto a, può in alcuni casi scrivere alla richiesta/risposta per un collegamento utente clic.
La richiesta in ingresso per l'aggiornamento asincrono assomiglia:
@RequestMapping("/getDashboardStatus.json")
public void getDashboardStatus(HttpServletRequest request, ...) {
final AsyncContext asyncContext = request.startAsync();
// 10 seconds
asyncContext.setTimeout(10000);
asyncContext.start(new Runnable() {
public void run() {
// .. (code here waits for an update to occur) ..
sendMostRecentDashboardJSONToResponse(asyncContext.getResponse());
if (asyncContext.getRequest().isAsyncStarted()) {
asyncContext.complete();
}
}
});
}
Cosa c'è di strano , è che ci sono link in questa dashboard che vanno ad altre pagine. Ogni ~ 100 clic circa, uno di questi sarà invece di visualizzare la pagina scelta, in realtà visualizza il JSON inviato sopra!
Ad esempio, abbiamo un metodo MVC separata:
@RequestMapping("/result/{resultId}")
public ModelAndView getResult(@PathVariable String resultId) {
return new ModelAndView(...);
}
E quando si fa clic su un link sul cruscotto che visita /result/1234
, ogni luna blu, la pagina si caricherà con uno stato OK 200, ma invece di contenere l'HTML previsto, in realtà contiene il JSON per la richiesta di polling!
È consentita una sola richiesta per client? Una richiesta avviata da un link cliccato sostituisce eventuali richieste asincrone che sono già presenti sul lato server dallo stesso client?
Come possiamo gestire queste richieste per garantire che la risposta asincrona vada alla richiesta async?
Ho notato un metodo hasOriginalRequestAndResponse()
sull'oggetto AsyncContext
, ma ho difficoltà a capire dal Javadoc se è ciò che sto cercando.
Aggiornamento: Ho appena aggiunto un frammento in questo modo:
String requestURI = ((HttpServletRequest)asyncContext.getRequest()).getRequestURI());
System.out.println("Responding w/ Dashboard to: " + requestURI);
sendMostRecentDashboardJSONToResponse(asyncContext.getResponse(), clientProfileKey);
ed era in grado di riprodurre il problema, durante corretta comportamento, vedo:
Responding w/ Dashboard to: /app/getDashboardStatus.json
Ma quando ho vedi JSON spinto alle richieste avviate da clic, vedo:
Responding w/ Dashboard to: null
C'è una discussione in corso sui tag utilizzati in questa domanda: http://meta.stackoverflow.com/questions/281443/how-general-must-a-problem-be-to-warrant-use-of -a-language-library-tag –
@Craig Otis Hai provato a utilizzare 'request.startAsync (richiesta, risposta);' invece di 'request.startAsync()'? – fmodos
@fmodos Ho letto i documenti per questo, ma in realtà non lo uso - non sembra che il comportamento cambierebbe in questo scenario? Sembra che gli argomenti di richiesta/risposta passati a quel metodo avrebbero dovuto essere gli stessi (o wrapper) delle richieste/risposte in arrivo, quindi sembra che avrebbe funzionato allo stesso modo. –