2017-03-19 4 views
1

J'ajoute un nouveau point de terminaison à un service Web basé sur Jersey. La logique supportant le point de terminaison doit effectuer entre 10 et 50 appels vers un autre service. Les appels sont indépendants et peuvent être parallélisés, donc je pensais utiliser le service d'exécution pour distribuer le travail sur plusieurs threads.Dois-je créer executorService dans une requête ou partager une instance à travers la webapp?

Je me demande si je devrais instancier un executorService pour chaque requête ou s'il devrait y avoir une instance executorService partagée à travers la webapp. Dans le dernier cas, comment devrais-je décider du nombre de threads qu'il devrait exécuter?

Répondre

2

Je me demande si j'instancier un ExecutorService pour chaque demande ou devrait-il y avoir une instance ExecutorService partagée entre l'application Web. Dans le dernier cas, comment devrais-je décider du nombre de threads qu'il devrait exécuter?

No. En général, vous ne devriez pas instancier le executorService pour chaque requête Web (option 1) parce que le serveur va bientôt manquer de mémoire et aussi, la création de pool de threads à la volée est coûteuse (temps).

Vous devez donc utiliser l'instance partagée (option-2) du executorService en le créant lors du démarrage du serveur. & configurez la taille du pool de threads en fonction de vos besoins et en effectuant les tests de performances.

Vous pouvez vous référer à here pour comprendre les pools de threads.

+0

Quelle est la meilleure approche pour implémenter l'option 2? Partager l'executorService le créant dans (par exemple) un contrôleur comme un champ statique? Ou pensez-vous qu'il existe une meilleure façon de partager le service d'exécution? – Rahnzo