Meilleures pratiques pour les servlets asynchrones
La fonction de servlet asynchrone permet de traiter les demandes et les réponses entrantes sans être lié à l'unité d'exécution à l'origine de la demande.
Tenez compte des meilleures pratiques lors de l'utilisation de servlets asynchrones :
- Les applications ne doivent pas générer une nouvelle unité d'exécution pour chaque opération asynchrone nécessaire. Au minimum, les applications doivent utiliser un pool d'unités d'exécution ou la méthode AsyncContext start(Runnable).
- Sur le client/serveur, vous pouvez utiliser AJAX pour certaines parties de la page à actualiser de manière asynchrone.
- Le conteneur de servlet évite de démarrer les appels d'exécution ou de répartition avant que l'unité d'exécution du conteneur web qui a initialisé la commande startAsync existe. Toutefois, le conteneur de servlet ne gère pas les unités d'exécution en utilisant la même demande et la même réponse simultanément. L'application peut gérer ses propres problèmes de simultanéité et de synchronisation dans ce cas, mais cela n'est pas recommandé afin d'éviter de générer des interblocages ou des problèmes de simultanéité. Si la méthode dispatch ou complete est appelée depuis une unité d'exécution créée par le client ou un exécutable démarré avec start(Runnable), l'opération dispatch ou complete peut démarrer immédiatement sur une nouvelle unité d'exécution ; dès lors, il devient dangereux de modifier la demande ou la réponse depuis l'unité d'exécution qui a émis ces appels. Deux unités d'exécution ont accès aux objets de demande et de réponse, si bien que les résultats peuvent être indéterminés si l'une et l'autre modifient ces objets. N'appelez pas de méthodes dans la demande ou la réponse après une distribution (dispatch) depuis la même unité d'exécution que celle qui a appelé dispatch. N'appelez pas de méthodes dans la demande ou la réponse après l'appel d'une opération 'complete'.
- Les écouteurs asynchrones utilisent une méthode onTimeout qui s'exécute lorsque un délai est atteint pour
l'opération de synchronisation. Cependant, il est possible que
l'opération asynchrone soit encore active sur une unité d'exécution alors que
la méthode onTimeout est lancée sur une autre unité d'exécution. Il s'agit du cas le plus courant
d'utilisation simultanée d'une demande et d'une réponse par plusieurs unités d'exécution. Une approche simple pour ce scénario consiste à utiliser une méthode AtomicBoolean partagée depuis AsyncListener et l'opération asynchrone, comme suit :
Dans ce cas, une seule unité d'exécution peut écrire dans la réponse.AtomicBoolean isOkayToRun = (AtomicBoolean) request.getAttribute("isOkayToRun"); if (isOkayToRun.setAndGet(false)){ //do a dispatch }
- Lorsque le délai est écoulé, le conteneur Web tente d'annuler tous les exécutables mis en file d'attente par des appels à la méthode start(Runnable). Cependant, tous ceux qui ont déjà démarré ne peuvent pas être interrompus, sous peine d'entraîner une fuite de mémoire.
- Le nombre d'exécutions exécutant des notifications de délai d'attente est très limité. Il n'est pas recommandé d'exécuter une opération intensive ou d'écriture depuis un délai d'attente, car même une petite opération d'écriture peut prendre une certain temps si le client a une connexion lente. Lorsque vous désactivez le délai d'attente asynchrone, le risque de générer des erreurs OutOfMemory ou d'épuiser le nombre de connexions de canaux TCP est plus grand. Le délai d'attente par défaut est de 30 secondes.
- Vous pouvez configurer certaines options de fonctionnement des servlets asynchrones, telles que les valeurs de délai d'attente et la méthode start(Runnable) de AsyncContext. Pour cela, dans la console d'administration, cliquez sur . Pour en savoir plus sur la configuration du conteneur Web, référez-vous à la rubrique correspondante.
Important : Le distributeur de demandes asynchrones (ARD) et
le distributeur de demandes à distance (RRD) ne sont pas pris en charge en cas d'utilisation
de servlets asynchrones.
Conseil : Consultez la rubrique sur les compteurs d'application Web pour en savoir plus sur
les mesures de données dans les servlets asynchrones.