2010-05-10 5 views
1

J'utilise des pièces de la structure Spring MVC; en particulier, j'utilise les annotations @Controller, @RequestMapping et @ResponseBody, en conjonction avec un webstatsHttpMessageConverter connecté à un bean marshaller OXM jaxb2. Mes méthodes de contrôleur utilisent les annotations @RequestParam pour analyser certains paramètres GET, interroger un service qui utilise un EntityManager JPA en arrière-plan et renvoie un objet JAXB converti en sa représentation XML par le HttpMessageConverter.Printemps MVC - @Controller annotation et le traitement des demandes concurrentes

J'ai réduit ce scénario à un cas de test très simple pour essayer de déterminer l'emplacement d'un retard d'exécution que j'ai remarqué; Exemple de méthode de contrôleur:

@RequestMapping("/my_service__method_endpoint") 
    @ResponseBody 
public Jaxb2CompiledClass getSomeData(@RequestParam String param1, 
         @RequestParam Date start, @RequestParam Date end) { 
      log.debug("Entering getSomeData"); 
      Thread.sleep(5000); 
      log.debug("Finished waiting, leaving getSomeData); 

    return new Jaxb2CompiledClass(); 
} 

Ce scénario fonctionne correctement et renvoie les données appropriées dans le format approprié. Cependant, lors du test de charge de cette configuration, j'ai rencontré un problème: chacune de mes méthodes de contrôleur annotées avec @RequestMapping ne s'exécute pas simultanément; Si j'appelle plusieurs demandes HTTP au point de terminaison du service, chaque appel de méthode se terminera avant le traitement de la prochaine requête HTTP. Dans mon code actuel, j'utilise des objets de service pour générer des résultats via JPA et transformer ces résultats en un objet de la classe Jaxb2 appropriée. Ma compréhension est que ce contrôleur devrait être capable d'exécuter ces méthodes simultanément, une pour chaque requête HTTP invoquant le/my_service__method_endpoint. Y a-t-il un concept fondamental qui me manque ici? La sortie du journal du code ci-dessus montre que chaque appel à getSomeData attend l'exécution de l'appel précédent avant de démarrer. Ceci est évidemment hautement indésirable dans un environnement à volume élevé.

+0

Comment générez-vous les requêtes HTTP? En utilisant un test automatisé, ou un navigateur? Aussi, pouvons-nous voir la configuration minimale de Spring, pour voir comment tout est câblé? – skaffman

+0

Pour le moment, je ne fais que générer les multiples requêtes HTTP dans un navigateur. J'ai des cas de test automatisés qui effectuent également des requêtes, mais ils ne sont pas concurrents - ils existent simplement pour valider que le XML généré est correct. Je vais recevoir la config de Spring dès que j'en aurai l'occasion. – diomedes01

+0

Les navigateurs ont une logique intégrée pour limiter les requêtes simultanées, ils sont un très mauvais outil pour faire ce genre de chose. Vous devez reproduire le test de charge à l'aide d'un outil automatisé. – skaffman

Répondre

3

La réponse de Skaffman est correcte - tout fonctionne bien en même temps, mais parce que j'étais trop paresseux pour utiliser un vrai outil de test de charge, mon navigateur limitait les requêtes avant qu'elles ne soient envoyées.

Questions connexes