2017-10-05 19 views
2

J'ai un serveur avec 48 processeurs qui hébergent une API REST Java EE 7 sur TomEE + 7.0.2.Service d'exécution géré dans TomEE

Certaines API ont besoin d'utiliser autant de CPU que possible car elles exécutent des algorithmes parallélisés. La portion parallélisée ne nécessite aucune base de données ou d'autres ressources, juste quelques manipulations lourdes dans une matrice double [] [] partagée.

Je travaille habituellement dans des contextes EJB, mais pour cette instance particulière ce n'est pas une exigence (et aussi préférable de ne pas l'être).

Jusqu'à présent, j'utilisais pour

ExecutorService pool = Executors.newFixedThreadPool(maxThreads); 

instancier un exécuteur testamentaire, mais comme cela semble engendrer des fils réels au niveau du système d'exploitation Je ne suis pas un grand fan de celui-ci - après une certaine charge JMeter tester même conduit à un point, où l'ensemble du bash a été bloqué et je ne pouvais même pas SSH le serveur jusqu'à redémarrage dur. Je suis tombé sur le concept de "Managed Executor Service", mais je ne trouve pas de tutoriel/exemple en ligne sur la manière de l'utiliser (et aussi de le configurer).

Pourriez-vous partager vos idées sur ce qui suit?

a) Comment configurer un pool de threads dans TomEE (par exemple via server.xml, context.xml ou tomee.xml), des exemples de code seraient appréciés?

b) Existe-t-il un moyen d'utiliser simplement un pool de threads par défaut (et est-ce assez astucieux pour ne pas avoir besoin de réglage, sinon, où pourrais-je commencer à faire ça)?

c) Comment puis-je rechercher le pool de threads dans Java puis - préféré via la recherche JDNI? D) Si une fois j'ai décidé de faire de cette ressource une partie d'EJB, à quoi ressemblerait le code pour Injection?

Mon contexte d'application est spécifié comme "myContext" dans server.xml, donc si vous fournissez des exemples, pourriez-vous indiquer à quoi ressembleront les chaînes de recherche, exactement?

À part cela, j'ai une installation très simple de TomEE + 7.0.2, je n'ai touché à aucune configuration jusqu'à présent.

Merci beaucoup pour votre aide!

Daniel

Répondre

0

est ici un bon tutoriel pour commencer: https://martinsdeveloperworld.wordpress.com/2014/02/25/using-java-ees-managedexecutorservice-to-asynchronously-execute-transactions/

Si vous injectez @ManagedExecutorService, tomee devrait vous donner un service par défaut et la piscine. Si elle ne le fait pas, c'est probablement un bug:

@Resource 
private ManagedExecutorService mes; 

Vous devriez être en mesure de le configurer dans TomEE.xml comme ça (je ne l'ai pas testé cela):

<Resource id="myManagedExecutorService" type="javax.enterprise.concurrent.ManagedExecutorService"> 
    Core = 5 
    Max = 25 
    KeepAlive = 5 s 
    Queue = 15 
    WaitAtShutdown = 30 seconds 
</Resource> 

Et dans votre code :

@Resource("myManagedExecutorService") 
private ManagedExecutorService mes; 

Je l'ai compris en regardant service-jar.xml.Vous pouvez également JMS et @Asyncronous qui sont un peu meilleures options que ManagedExecutorService à mon avis

0

vous trouverez la documentation ici http://tomee.apache.org/admin/configuration/resources.html#_managedexecutorservice

L'avantage principal de ces exécuteurs sont:

  1. il est configuré dans le conteneur - pas besoin d'une configuration d'application personnalisée mais il est encore réglable sans recompiler/modifier l'application
  2. il n'est pas limité comme @Asynchronous qui ne définit pas de pool particulier donc la portabilité n'est pas très élevée eas ces piscines gérées sont assez uniformes
  3. ces piscines sont « entreprise » amicale parce que vous avez des auditeurs pour ajouter la sécurité et l'audit
  4. ces pools propager un contexte (sécurité et jndi/la classloader en général)

En tomee nous ali